所以假设您有一个singleton模式或其他模式:
class Smth{
public static function Foo(){
static $instance;
if(!condition()) return false; // <-- it's nothing...
if(!($instance instanceof FooClass)) $instance = new FooClass();
return $instance; // <-- it's a object and has that method
}
}
因此,如果我在满足condition()
时调用Smth::foo()->A_foo_method()
,那么该方法就会执行,一切都正常
但如果不满足condition()
,显然我会得到一个致命的错误,告诉我Smth::foo()
不是一个对象等等…
我怎么能简单地忽略第二种情况呢。?我的意思是什么都不要做,也不要表现出致命的错误。
(除了在类外检查condition()之外,在调用方法时)
您不想这样做这是一次无声的失败,这不是一件好事。当您调用一个方法时,您希望它做一些事情(尤其是Singleton模式中类似getInstance
的方法,它应该返回一个实例)。因此,是的,在调用A_foo_method()
之前,您必须检查foo()
是否返回了一个实际对象。相反,静默失败可能会造成调试混乱。
看看特殊情况模式。
这是因为您正在从Smth::foo()
返回false
。这应该返回Foo
的实例,以便链的其余部分可以运行。
我认为您正在进行Foo
的延迟加载。看看下面对DB对象执行相同操作的简单示例,看看它是否可以扩展。
private static $dbh;
public static function DBC() {
if (self::$dbh === null) {
self::$dbh = new mysqli($mysql['host'], $mysql['un'], $mysql['pw'], $mysql['db']);
}
return self::$dbh;
}