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