忽略不存在的方法

时间:2011-06-06 15:05:39

标签: php class methods 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
  }
}

所以,如果我在满足Smth::foo()->A_foo_method()时调用condition(),那么该方法就会执行,一切正常。

但是如果condition()没有达到,显然我得到一个致命错误,告诉我Smth::foo()不是对象等...

我怎样才能完全忽略第二种情况。我的意思是不做任何事情,也不要表现出致命的错误。

(除了检查类外的condition(),调用方法时)

3 个答案:

答案 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;
}