【问题标题】:__destruct in __construct?__destruct 在 __construct?
【发布时间】:2011-12-21 16:46:53
【问题描述】:

我遇到过一种情况,如果__construct 中的条件为真,我需要调用__destruct

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

有办法吗?

我可以用一个技巧来做到这一点,但我需要在我的班级内做到这一点,如果不符合我的标准,目标是破坏一个班级。

编辑:

在构造函数中,我检查用户权限,如果尝试删除帖子的用户不是管理员,则不应实例化该类的对象,或者说应该破坏。

【问题讨论】:

  • 您的标准是什么?如果这是您要的,则不可能将整个物体吞下。

标签: php class


【解决方案1】:

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

问问自己,在无法构造对象的情况下,调用现场的new运算符应该返回什么?

$obj = new Class();

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

你有几个选择:

  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...
    }
    

【讨论】:

  • 静态工厂完成了这项工作。 tnx @Juliano
【解决方案2】:

请理解,调用析构函数与从工作集中移除类不同!

如果 myClass 是你在构造函数中析构的类,那么

$a=new myClass();

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

【讨论】:

  • 这不是我要找的,但还是 tnx。
【解决方案3】:

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

<?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

【讨论】:

  • 这是我做的一个技巧,但我的问题是破坏你在构造函数中实例化的对象。
【解决方案4】:

如果您在构造函数中抛出异常,则不会创建对象...因此,如果构造函数代码确定了您的条件,请在构造函数中整理您需要的任何内容并抛出异常...记住将您的在 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);

【讨论】:

  • 我试图不使用异常。因为我不想做一些开销。感谢@Mark Ba​​ker 的帮助。
猜你喜欢
  • 2012-02-27
  • 2012-03-19
  • 2010-09-18
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多