Есть ли какая-то уверенность при вызове __destruct при рассмотрении простых объектов без циклов ссылок? Я знаю из java, что не определено, когда и если вызывается функция finalize, это зависит от сборщика мусора.
Например, если у вас есть такая функция, как:
1 function test(){
2 $x = new SomeObject();
3 $y = new SomeObject();
4 $x = null;
5 }
Где SomeObject
не имеет эталонных циклов.
Можете ли вы предположить, что $x->__destruct
вызывается в строке 4, а $y->__destruct
вызывается в строке 5?
Тестирование следующего скрипта, по-видимому, указывает на то, что это правда:
Кроме того, SplFileObject
, кажется, работает с этим предикатом: невозможно закрыть файл, вместо этого вам просто нужно установить переменную в null. Если бы это не вызывало __destruct
напрямую, было бы невозможно надежно открыть файл после того, как он был открыт с помощью SplFileObject
.
Я обнаружил, что есть гарантия того, что __destruct
будет вызвана в конце концов, но не когда.