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


Constructor returns an object, not a value

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

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

构造函数:你做错了

构造函数顾名思义:构造一个对象的新实例。因此,构造函数返回的唯一有意义的东西就是该对象的实例。注意,您几乎不会看到带有显式return语句1的构造函数。

要完成我认为你想做的事情,更简洁的方法是使用异常:

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它们是允许的,所以可能有一个令人信服的原因。只是现在想不起来。

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

构造函数的返回值被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;
     }
}