我有一个可以在PHP中使用,或者吃掉的东西。无论如何,它最终消失了。我有一个名为activate()
的抽象受保护方法,它由公共方法useItem()
调用。
调用useItem()
后activate()
是否有可能自行销毁?如果没有,确保物品永久消失的最佳方法是什么?
答案 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,则可能仍会遇到一些性能问题。