我遇到过一种情况,__destruct如果条件成立,我需要调用__construct!
如何在构造函数中调用析构函数?
有办法吗?
我可以通过一个技巧来做到这一点,但我需要在我的课程中完成,目标是如果不符合我的标准就破坏一个课程.
编辑:
在构造函数中,我检查用户权限,如果尝试删除帖子的用户是admin之外的其他人,那么该类的对象不应该被实例化,或者应该被破坏.
Jul*_*ano 10
避免在构造函数中进行实际工作.构造函数应该基本上构建对象的实例.__destruct()从构造函数调用没有意义,因为实例不是由类的方法拥有,而是由调用new运算符的函数拥有.
问问自己,new在无法构建对象的情况下,操作员应该在呼叫站点返回什么?
$obj = new Class();
Run Code Online (Sandbox Code Playgroud)
$obj如果无法正确构造对象,应该分配什么?NULL?或者代码根本没有意义?
你有几个选择:
从构造函数中删除任何非构造代码,以便构造函数根本不会失败.在另一种方法中放置任何失败的代码.例:
$obj = new Class();
if ( $obj->initSomeStateThatMayFail() ) {
// good, proceed...
} else {
// handle failure somehow...
}
unset($obj); // calls __destruct()
Run Code Online (Sandbox Code Playgroud)如果构造函数中的失败应该通知给调用者,请使用静态工厂方法来测试实例化类是否有效,并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)如果代码在无法构造类的情况下根本没有意义,也许你应该抛出异常.
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)