构造函数返回一个对象,而不是一个值

时间:2011-09-08 23:32:37

标签: php object constructor return

为什么构造函数返回对象,而不是返回值(布尔值)?

class A{

  function __construct($stuff){

    return ($this->load($stuff) !== false);
  }
}

$aaa = new A($stuff);

if(!$aaa)  die('error'); // never happens


print_r($aaa); // it's a object...

3 个答案:

答案 0 :(得分:4)

构造函数:你做错了。

Constructors做他们的名字所暗示的:构造一个对象的新实例。因此,构造函数返回唯一有意义的是该对象的实例。请注意,您几乎从未看到具有显式return语句 1 的构造函数。

完成我认为你想要做的更干净的方法是使用exceptions

class A {
    function __construct($stuff) {
        if ($this->load($stuff) === false) {
            throw new Exception('Unable to load');
        }
    }
}

try {
    $aaa = new A($stuff);
} catch (Exception $e) {
    die('error' . $e->getMessage());
}

1 他们允许的,所以可能有一个令人信服的理由。现在就想不到它。

答案 1 :(得分:1)

构造函数只能返回对象的新实例。 您可以尝试使用静态函数调用来调用构造函数并返回false或新对象。

答案 2 :(得分:0)

new运算符忽略构造函数的返回值。 new运算符将始终返回一个对象。有像

这样的代码
class A {
    function __construct() {
        return 1;
    }
 }
 class B extends A {
     function __construct() {
         var_dump(parent::__construct());
     }
 }
 new B();

你可以看到构造函数有一个返回值。编写这样的代码当然没什么意义。

为了处理构造函数中的错误,您必须使用异常。另一种方法是某种工厂方法。

class C {
    private function __construct() { }
    private function init() {
        if (something_goes_wrong()) {
            return false;
        }
     }

     public static createInstance() {
         $retval = new self;
         if (!$retval->init()) {
             return false;
         }
         return $retval;
     }
}