Вызов деструктора внутри метода объекта в PHP - PullRequest
2 голосов
/ 22 июня 2010

У меня есть объект, который можно использовать, или есть, или еще много чего в PHP.В любом случае, это в конечном итоге прошло.У меня есть абстрактный защищенный метод с именем activate(), который вызывается открытым методом useItem().

Возможно ли для useItem() уничтожить себя после вызова activate()?Если нет, то как лучше всего убедиться, что предмет навсегда пропал?

Ответы [ 2 ]

3 голосов
/ 22 июня 2010

Если я правильно понимаю, у вас есть что-то вроде:

class AbstractMyClass {
    abstract protected function activate();
    public function useItem() {
        //...
        $this->activate();
        //...
    }
}

class MyClass extends AbstractMyClass { /* ... */ }

В этом случае нет, невозможно вызвать разрушение объекта после вызова useItem, если не считать:

$obj = new MyClass();
$obj->useItem();
unset($obj);
//if there are cyclic references, the object won't be destroyed except
//in PHP 5.3 if the garbage collector is called

Конечно, вы можете заключить разрушаемый объект в другой:

class MyClass extends AbstractMyClass { /* ... */ }
class MyWrapper {
    private $inner;
    public function __construct($object) {
        $this->inner = $object;
    }
    public function useItem() {
        if ($this->inner === null)
            throw new InvalidStateException();
        $this->inner->useItem();
        $this->inner = null;
    }
}

$obj = new MyWrapper(new MyClass());
$obj->useItem();
1 голос
/ 22 июня 2010

Вы можете просто отменить () его, если хотите.

Реально, сборщик мусора или GC в PHP выполнит всю необходимую работу, как только переменная выйдет из области видимости или если на нее нет нулевых ссылок. Чтобы было ясно, GC претерпел серьезные изменения в PHP 5.3, поэтому, если вы используете 5.2.x, у вас могут возникнуть некоторые проблемы с производительностью.

...