2011-06-06 60 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