【问题标题】:Can PHP object can destruct itself on construct?PHP对象可以在构造时自行破坏吗?
【发布时间】:2013-09-04 20:57:21
【问题描述】:

function __construct()可以在构造后自毁吗?

类似于下面的伪代码,如果是,那么如何做:

function __construct() {
  if($something) echo "OK!"
  else __destruct();

}

【问题讨论】:

  • -1 你试过了吗?
  • 它能自毁吗?
  • 1) 你试过了吗? 2) 为什么还要手动调用__destruct()? 3)为什么!?!?! 4) 呜?为什么?
  • 释放内存。是的,我试过Fatal error: Call to undefined function __destruct() in...
  • Jusr throw 在这种情况下@ulkas

标签: php oop constructor destructor


【解决方案1】:

方法__destruct是PHP中的神奇方法,不能手动调用。

但是它并没有真正的魔法,方法的名称应该类似于onDestructed 左右,就像一个事件监听器。

所以,__destruct 在没有更多对该对象的引用时被调用。方法的实现可能如下:

function __destruct(){
  echo "An object of class " . __CLASS__ . " has been destroyed " ;
}

回答你的问题,是的,它可以被显式调用,你只需执行方法 __destruct 中的代码,但你不会破坏对象(除非你在其中进行一些真正的垃圾回收)。

function __construct($something) {
  if($something) 
    echo "OK!" ;
  else 
    $this->__destruct(); // $this-> must be used here!
}

要销毁它,您可以使用 unset($object) 或在某些情况下将其设置为 null。

【讨论】:

  • 谢谢。 unset 可以不引用对象吗?它们是其他移除对象的方法吗?我担心我糟糕的 OOP 技能会窒息内存,以防万一以后删除所有我不需要的对象。
【解决方案2】:

如果您使用 $test = new YourObject() 创建我们的 Object 的实例,那么当您立即销毁它时,将无法再将它的实例返回到 $test...

【讨论】:

    【解决方案3】:

    您总是可以使用条件来确定对象是否被构造:

       if($something) {
       $object = new Class();
       }
    

    【讨论】:

      【解决方案4】:

      如果你在构造函数中销毁对象,那么你可以达到你的要求,如下所示。

      class class1
      {
          function __construct()
          {
              print "constructor\n";
              print "Now destructor going to call\n";
              unset($this);
          }
          function __destruct()
          {
              print "this is destructor\n";
          }
      }
      $obj=new class1;
      

      在上面的例子中。 创建对象时,它将调用构造函数,然后调用构造函数 函数通过 unset 函数销毁自身,然后调用析构函数和 对象也被破坏了。

      【讨论】:

        猜你喜欢
        • 2014-08-12
        • 2015-05-12
        • 2011-03-31
        • 2020-06-12
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多