2011-06-06 65 views
0

让我们假设你有一个单例模式或什么:忽略不存在的方法

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()满足,则执行该法,一切都OK。

但如果condition()不符合,很明显,我得到一个致命的错误,告诉我,Smth::foo()不是一个对象等等......

我怎么能简单地忽略第二个情况?我的意思是不要做任何事情,也不要显示致命的错误。

(除了检查条件()类外,在调用方法时)

+0

我假设你想把'$ instance'作为对'Foo'的引用?你还可以详细说明'condition()' – 2011-06-06 15:09:13

+0

'condition()'是一个正常的函数,用于检查当前正在显示的页面是否为特定的页面... – Alex 2011-06-06 15:10:08

回答

2

你不想这样做。这是一个沉默的失败,这不是一件好事。当你调用一个方法时,你期望它做一些事情(特别是Singleton模式中类似getInstance的方法,它应该返回一个实例)。所以是的,在调用A_foo_method()之前,您必须检查foo()是否返回实际对象。沉默失败反而会造成调试混乱。

1

这是因为你从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; 
} 
2

看看Special Case模式。

+0

呃,同时使用特殊情况*和*单例?这应该提高头痛药物的销售量。 – netcoder 2011-06-06 15:14:38

+0

@netcoder是的可能;)但我认为这是一个很好的适合这个问题的特殊情况; D – Yoshi 2011-06-06 15:18:14