2010-06-22 80 views
2

我有一个可以在PHP中使用或者吃掉的东西。无论如何,它结束了。我有一个被称为activate()的抽象受保护方法,该方法由公共方法useItem()调用。在PHP的对象方法中调用析构函数

拨打activate()useItem()有可能销毁吗?如果没有,确保物品永久消失的最佳方法是什么?

回答

1

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

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

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(); 
相关问题