2011-06-02 67 views
1

通常,當我會做一些這樣替代普通的PHP類

class Foo 
{ 
    public function Foo(){} 
    public function RandomFunction(){}; 
} 
global $foo; 
$foo = new Foo(); 
$foo->RandomFunction(); 

我已經注意到了網絡人於全局變量的類皺着眉上,但沒有它,我不會能夠訪問其他功能內的類。

我們這另一種方法是使用靜態階級作爲階級:

class Foo 
{ 
    static public function RandomFunction(){} 
} 
Foo::RandomFunction(); 

我的問題是這樣的,這是爲類全局變量的最佳替代品?還是有更好的方法可以將它們放在一起?

+0

我不太確定你的目標是什麼。爲什麼'$ foo'需要在你的例子中是全局的?如果您想在其他函數中訪問該實例,則應該將其作爲參數傳遞。我有這樣的感覺,你正在使用一個容器(任意)函數的類... – 2011-06-02 14:18:45

+1

如果你使用的是PHP5,請開始使用'__construct'。 – meagar 2011-06-02 14:26:41

+0

那麼,例如,wordpress在其函數中使用全局$ foo,所以$ foo類可以從其他函數或類訪問。將它作爲參數傳遞聽起來是一個糟糕的主意。 – brenjt 2011-06-02 14:27:32

回答

4

在良好的OO實踐中,如果一個類需要訪問另一個類的實例,則將對象作爲參數傳入,然後從那裏訪問它的屬性和方法。

如果你有一個設計良好的對象模型,代碼應該是相對乾淨和合乎邏輯的,但是如果你不打算創建一個嚴格的面向對象的應用程序,你可能不應該擔心你的類在全局範圍內。

+0

你真的會把它作爲參數傳遞嗎?這似乎並不是非常有效的做到這一點。但是,我再次對此更新。 – brenjt 2011-06-02 14:32:26

+0

是的,絕對。如果一個類需要另一個類的實例,它將發送一個對象作爲參數傳遞給其他數據類型。如果您有Person()類,您可以傳遞它(「食物」,「冰淇淋」,​​「200卡路里」)或含有所有這些信息和相關方法的食物對象。閱讀一些設計模式應該清楚這一點。 – Sam152 2011-06-02 14:33:35

+0

儘量不要太深入閱讀隱喻。只要將一個類看作一個普通的數據類型,就像一個int或一個帶有一些額外的鈴聲和哨子的字符串,你可以使用。好的問題,但在未來的研究中祝你好運。 +1 – Sam152 2011-06-02 14:45:34

2

想象你的對象就像一輛自行車。你擁有你的自行車,並可以將它租借給任何你想要的人。他們可以使用它並將其返還給您,並且您將能夠跟蹤誰對您的自行車做了什麼,以及何時。

但是,如果您的自行車普遍適用於世界上的任何人,但是您的監控和控制訪問權的工作將會成倍地變得更加困難。你將很難跟蹤誰使用你的自行車,他們正在使用它,以及他們是如何使用它(ab)。

傳遞對象(而不是全局聲明它們)可以讓您對對象及其所包含的數據進行更嚴格的控制。

+0

作爲'&$ classname'中的引用傳遞? – brenjt 2011-06-02 14:33:24

+1

最近版本的PHP通過引用函數自動傳遞對象,所以你不需要使用'&'。 – 2011-06-02 14:36:04

+0

因此,本質上我可以做$ foo-> RandomFunction($ object,$ otherparam)。說得通。 – brenjt 2011-06-02 14:41:54