PHP:
class A {
private $x = null;
function __construct($x) {
echo "CONSTRUCTOR A<BR>";
$this->x = $x;
}
function __destruct() {
echo "DESTRUCTOR A<BR>";
$this->x = null;
}
function C() {
$this->x->S();
}
function F() {
$this->x = null;
}
function K () {
echo "OK<BR>";
}
}
class B {
private $m;
function __construct() {
$this->m = mt_rand(100,1000);
echo "CONSTRUCTOR B - ".$this->m."<BR>";
}
function __destruct() {
echo "DESTRUCTOR B ".$this->m."<BR>";
$this->m = 0;
}
function S () {
echo "S(".$this->m.")<BR>";
}
}
$b = new B();
$a = new A($b);
$b = null; // 1
$a->C();
$a->F(); // 2
$a->K(); // 3
// end of script
до строки 1 на B было 2 ссылки - одна в $b другая в $a->x
после строки 1 ссылка осталась одна и до строки 3 вызывается деструктор B - т.е. ссылок на B не осталось и объект удален - все красиво, счетчик ссылок работает.
если закомментировать 1 или 2, то объект доживет до конца скрипта и потом вызовется его деструктор - опять все замечательно, так и должно быть
допустим мы закомментили 1 и 2 - на B остаются 2 ссылки
чудеса начинаются после того, как образно говоря php отработал последний байт скрипта - у него отрубается блок подсчета ссылок, он начинает убивать не переменные, а объекты.
по нормальному php должен поступать примерно так :
unset($b); - на B жива одна ссылка - объект жив (а в реале здесь делается delete B)
unset($a); - ссылки на A = 0, вызывается деструктор A -
$this->x = null; -> убивается последняя ссылка на B
если в деструкторе А нет такого, то ссылка удаляется при выходе из деструктора
число ссылок на B = 0 => вызывается деструктор B
так не сделано, а сделано както по другому... почему? производительность упадет? лень делать? ошибка в вышеописанной логике? вопрос "почему" открыт