在__construct中__destruct?

ALH*_*ALH 1 php class

我遇到过一种情况,__destruct如果条件成立,我需要调用__construct!

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

有办法吗?

我可以通过一个技巧来做到这一点,但我需要在我的课程中完成,目标是如果不符合我的标准就破坏一个课程.

编辑:

在构造函数中,我检查用户权限,如果尝试删除帖子的用户是admin之外的其他人,那么该类的对象不应该被实例化,或者应该被破坏.

Jul*_*ano 10

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

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

$obj = new Class();
Run Code Online (Sandbox Code Playgroud)

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

你有几个选择:

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

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

    class Class {
        static function makeClass() {
            if ( testIfValidToInstantiate() ) {
                return new self();
            } else {
                return null;
            }
        }
        // ...
    }
    
    $obj = Class::makeClass();
    if ( $obj !== null ) {
        // proceed...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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...
    }
    
    Run Code Online (Sandbox Code Playgroud)