为什么构造函数返回对象,而不是返回值(布尔值)?
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...
答案 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;
}
}