所以让我们说你有一个单身模式或其他:
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
}
}
所以,如果我在满足Smth::foo()->A_foo_method()
时调用condition()
,那么该方法就会执行,一切正常。
但是如果condition()
没有达到,显然我得到一个致命错误,告诉我Smth::foo()
不是对象等...
我怎样才能完全忽略第二种情况。我的意思是不做任何事情,也不要表现出致命的错误。
(除了检查类外的condition(),调用方法时)
答案 0 :(得分:2)
你不想这样做。这是一个无声的失败,这不是一件好事。当你调用一个方法时,你期望它做一些事情(特别是一个类似getInstance
的方法,它应该返回一个实例)。所以,是的,您必须在调用foo()
之前检查A_foo_method()
是否返回实际对象。无声地失败可能会造成调试混乱。
答案 1 :(得分:2)
查看Special Case模式。
答案 2 :(得分:1)
这是因为您从false
返回Smth::foo()
。这应返回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;
}