2012-07-01 86 views
2

類的成員訪問在PHP的之前的版本5.4 I使用的靜態類實例化對象,並立即調用所需的功能,例如:靜態類VS上實例化

$result = Foo::init()->bar(); 

在上面的例子中,靜態函數init()只是實例化它所包含的類並將其作爲對象返回。這提供了方法鏈接功能,並允許我立即在一行代碼中調用bar()。靜態函數init()看起來是這樣的:

static public function init() { 
    $object = new self(); 
    return $object; 
} 

對實例化類成員訪問現在PHP 5.4增加了支持,而不是使用一個靜態類現在我可以做到以下幾點:

$result = (new Foo)->bar(); 


我的問題:是我使用靜態類的舊方法不好,如果是這樣,爲什麼?現在PHP支持實例化類成員訪問,這是在對象實例化後立即訪問類成員的更正確方法嗎?

+1

當你需要一個功能時,你爲什麼要寫一個類? - 也許兩者同樣糟糕:你應該有兩堆對象:那些照顧實例化別人的人,以及那些不在乎的人。 – hakre

+0

我在我的問題中提供的代碼只是一個簡單的例子來展示我正在談論的概念。你想介紹一下你對兩堆物品的評論嗎? –

+2

看看這裏:http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/,還有一個視頻:http://www.youtube .com/watch?v = 4F72VULWFvc - 這兩對物體大約在24分鐘左右,但整個視頻值得一看。 – hakre

回答

1

如果這就是你所有的->init()所做的,那麼你可以通過(new Foo)->bar();逃脫,但是當你進入Dependancy Injection路由時,你很可能想創建某種Factory來在實例化時注入這些依賴關係。工廠可能是一個完整的實例化對象,或者只是一個靜態的初學者方法,但事實是:如果你需要外部訪問注入你的類(數據庫處理程序,設置)現在或可能在未來,你don 't想要濫用全局變量或單例變量(這是一種全局變量...),你會非常感謝你有1個方法/類,其中你的對象被實例化,而不是通過代碼庫散佈。

3

是的,新方法更加正確,所以如果你能夠使用它。不過,你以前的方式並不是「壞」的;這是一個令人沮喪的問題的乾淨,簡單的解決方案。