在PHP中调用Object方法中的析构函数

时间:2010-06-22 16:52:56

标签: php oop destructor

我有一个可以在PHP中使用,或者吃掉的东西。无论如何,它最终消失了。我有一个名为activate()的抽象受保护方法,它由公共方法useItem()调用。

调用useItem()activate()是否有可能自行销毁?如果没有,确保物品永久消失的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

如果我理解正确你会有:

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 :(得分:1)

如果您愿意,可以简单地取消设置()。

实际上,一旦变量超出范围或者没有对它的引用,PHP中的garbage collector or GC将完成您需要的所有工作。为了清楚起见,GC在PHP 5.3中进行了重大修改,因此如果您使用的是5.2.x,则可能仍会遇到一些性能问题。

相关问题