代码之家  ›  专栏  ›  技术社区  ›  waiwai933

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

  •  2
  • waiwai933  · 技术社区  · 14 年前

    我有一个对象,可以在PHP中使用、食用或其他。无论如何,它最终都消失了。我有一个抽象保护的方法 activate() ,它由公共方法调用 useItem() .

    有可能 使用项() 打电话自毁 激活() ? 如果没有,什么是确保物品永久消失的最佳方法?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Artefacto    14 年前

    如果我没弄错的话,你有这样的东西:

    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();
    
        2
  •  1
  •   CaseySoftware    14 年前

    如果您愿意的话,您可以简单地取消设置它。

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