Деструктор выводится при компиляции в последнюю очередь
Primary tabs
Почему деструктор выводится в последнюю очередь даже если мы напечатаем цифру 5 после последнего обращения к методу класса?
<?php class MathComplex { public $re, $im; public $k = 0; function __construct($re = 0, $im = 0) { $this->re = $re; $this->im = $im; echo " ABC "; } // почему при выключении функции ничего не поменялось? function add(MathComplex $y) // указываем объект то же самого класса в качестве параметра функции { $this->re += $y->re; $this->im += $y->im; } function __toString() { return "{$this->re}, {$this->im}"; } function __destruct() { echo "B!"; $a = 3; echo $a; $this->k += $this->k+1; echo "счетчик равен:", $this->k; } } // require_once "classes.php"; echo " obj1 = new MathComplex(445,41) : " ,$obj1 = new MathComplex(445,41); echo "\n"; // ABC 445, 41 echo " obj2 = new MathComplex(1,14) : " ,$obj2 = new MathComplex(1,14); echo "\n"; // ABC 1, 14 $obj1->add($obj2); echo "add: ", $obj1; // 446, 55 echo "\n"; echo " obj1 : ",$obj1; // 446, 55 echo "\n"; echo "obj1 : ",$obj1; // 446, 55 echo "\n"; echo "obj1->im obj1->re: ", $obj1->im," ", $obj1->re; // 55 446 echo "\n"; //echo " destruct() : ",$obj1->__destruct(); echo "\n"; // после вызова всех методов деструктор гарантировано вызовет два раза "B!3счетчик равен:1" при счетчик $k также, равен "1"; echo 5; // если мы напечатаем "5", то деструктор будет после этой цифры echo "\n";
- Log in to post comments
- 2425 reads
vedro-compota
Sun, 06/07/2020 - 23:14
Permalink
деструктор вызывается когда
деструктор вызывается когда все ссылки на объект потеряны.
а потому:
_____________
матфак вгу и остальная классика =)
vedro-compota
Sun, 06/07/2020 - 23:20
Permalink
как вызвать деструктор в нужной строке
чтобы вызвать деструктор сразу можно написать:
или там:
-- и то и другое приведет к потере ссылки на первоначальный объект (при условии, что на него не указывали другие переменные).
Тем не менее, вызов деструктора в любом случае определяется алгоритмом уборки мусора, и в какой-то реализации может проходить и не сразу - это надо отдельно уточнять по документации.
В вашем же примере память очищалась только после завершения скрипта, так как до этого ссылка obj1 продолжала указывать на объект - а потому и деструктор вызывался после всех явных действий, непосредственно написанных в скрипте.
_____________
матфак вгу и остальная классика =)
vedro-compota
Sun, 06/07/2020 - 23:24
Permalink
Деструктор выводится при
не выводится, а выполняется, не при компиляции, а при интерпретации
_____________
матфак вгу и остальная классика =)