是否可以优雅地退出php中的构造函数?
的影响class Foo {
function __construct()
{
$active = false;
if(!$active)
{
return false;
}
}
}
我正在尝试完成此操作,因为我想检查一下该类中的任何方法是否应该基于配置文件运行。我不想在每个方法中检查配置文件以查看方法是否应该运行。
答案 0 :(得分:7)
这取决于你“优雅地”的意思。如果您希望构造函数失败,可以抛出异常,或者可以使用工厂模式:
class FooFactory {
function makeFoo() {
return $someConstraint ? null : new Foo();
}
}
也许你可以详细说明你想要完成的是什么。
答案 1 :(得分:3)
让它爆炸。在构造函数中没有优雅的失败。也许在调用代码中,但不在构造函数中。抛出异常并妥善处理。
答案 2 :(得分:3)
我可以闻到代理模式。您要实现的目标不是让构造函数正常失败,而不允许基于某些$ active标准在对象上调用方法。
This可能会指向正确的方向。或许不是(=&gt;&gt;我不太喜欢我链接的页面,但它是我能找到的最好的PHP)。也许从其他来源给代理读取。基本上,您的ProxyObject将引用实现对象,执行方法。您的客户端代码将调用ProxyObject上的方法,就像它是真实的东西一样,并且ProxyObject将决定它是否处于活动状态,是否将消息传递给真实的东西< / em>或者不返回任何值或空值或虚值。听起来不错?
答案 3 :(得分:2)
如果构造函数做了那么多逻辑,那么它的设计并不好。 保持空白,通过setter方法将配置传递给它,让它在那里失败。
这不是OO编程:
$o = new myObject();
if (!is_object($o)) // then what???
答案 4 :(得分:1)
如果构造函数失败,则应抛出异常,而不是返回false值。除非您使用像C这样的语言,其中对象构造中的异常意味着它永远不会被解构。
原因是因为异常强制程序处理它,它会给你带来不好的数据。如果你返回一个值,比如-1或者其他什么,程序可以静默地继续并忽略它,直到它在以后引起问题。抛出异常会阻止这些无提示错误进入代码。你可能知道如果它没有正确构造它会返回false,但你的同事可能没有并且可能会愉快地尝试使用他认为是他构造的对象来发现它实际上是一个布尔值。
答案 5 :(得分:0)
我认为N3rd提出了一个非常酷的解决方案,但这是另一种更简单的方法。
class Foo {
private $active = TRUE;
function __construct() {
$this->check ( $active );
//OR
//if ($this->check ( $active )) { do something }
}
function check($var) {
if (! $var) {
$this->active = FALSE;
return FALSE;
}
return TRUE;
}
}