在__construct中__destruct?

时间:2011-12-21 16:46:54

标签: php class

我遇到过__destruct条件为真时需要调用__construct的情况!

如何在构造函数中调用析构函数?

有没有办法呢?

我可以通过一个技巧来做到这一点,但我需要在课堂上进行,目标是在不符合我的标准的情况下破坏课程。

编辑:

在构造函数中,我检查用户权限,如果尝试删除帖子的用户是admin以外的用户,那么该类的对象不应该被实例化,或者换句话说应该被破坏。

4 个答案:

答案 0 :(得分:10)

避免在构造函数中进行实际工作。构造函数应该基本上构建对象的实例。从构造函数中调用__destruct()是没有意义的,因为实例不是由类的方法拥有,而是由调用new运算符的函数拥有。

问问自己,在无法构建对象的情况下,new运营商应该在呼叫站点返回什么?

$obj = new Class();

如果无法正确构造对象,应该为$obj分配什么? NULL?或者代码根本没有意义?

您有几个选择:

  1. 从构造函数中删除任何非构造代码,以便构造函数根本不会失败。在另一种方法中放置任何失败的代码。例如:

    $obj = new Class();
    if ( $obj->initSomeStateThatMayFail() ) {
        // good, proceed...
    } else {
        // handle failure somehow...
    }
    unset($obj);  // calls __destruct()
    
  2. 如果构造函数中的失败应该通知给调用者,请使用静态工厂方法来测试实例化类是否有效,并正确返回null或新实例。

    class Class {
        static function makeClass() {
            if ( testIfValidToInstantiate() ) {
                return new self();
            } else {
                return null;
            }
        }
        // ...
    }
    
    $obj = Class::makeClass();
    if ( $obj !== null ) {
        // proceed...
    }
    
  3. 如果无法构造类,代码根本没有意义,也许你应该抛出异常。

    class Class {
        function __construct() {
            if ( !testIfValidToInstantiate() )
                throw new Exception( "Unexpected condition" );
            // ...
        }
    }
    
    try {
        $obj = new Class();
        // ...
    } catch ( Exception $e ) {
        // do something to handle this situation...
    }
    

答案 1 :(得分:3)

请理解,调用析构函数与从工作集中删除类不是一回事!

如果myClass是在构造函数中进行破坏的类,那么

$a=new myClass();

仍然会导致$ a被分配给myClass的一个实例!

答案 2 :(得分:0)

你不能从构造函数中销毁对象,但是你可以让它设置一个变量,并且在你创建它之后它就是毁掉它。像这样:

<?php
class test{
  function __construct(&$dest=false){
    echo "Constructed\n";
    if(1 == 1){ //Some condition
      $dest = true;
    }
  }

  function __destruct(){
    echo "De-Constructed\n";
  }
}

$a = new test($d);
if($d){
  unset($a);
}
echo "End Prog\n";

演示:http://ideone.com/fJxOq

答案 3 :(得分:0)

如果你在构造函数中抛出异常,那么就不会创建对象...所以如果构造函数代码识别你的条件,整理你在构造函数中需要的任何东西并抛出异常......记住要包含你的try / catch块中的实例化。

class testClass {
    public function __construct($killMe=false) {
        if ($killMe) {
            // Do any tidying up you need within the class
            throw new Exception('KILLED');
        }
    }

}

try {
    $a = new testClass(false);
} catch (Exception $e) {
    echo 'DIED IN CONSTRUCTION',PHP_EOL;
}
var_dump($a);

try {
    $b = new testClass(true);
} catch (Exception $e) {
    echo 'DIED IN CONSTRUCTION',PHP_EOL;
}
var_dump($b);