2010-02-24 24 views
2

我們在這裏進行討論。哪個更好?爲什麼?在PHP中有一個原因使用類而不是獨立的方法的靜態方法?

1)一個PHP文件,只是包括功能...

function bar(){} 

稱爲像包含一個靜態方法一類這個

bar(); 

2)PHP。

class foo{ 
static function bar(){} 
} 

這樣調用 FOO ::巴();

是否有任何性能的原因做一個或另一個?對於代碼組織的目的來說,靜態方法對我來說看起來更好,但是這裏有一些程序員沒有理由聲明類。

+0

'class foo'只包含這個靜態方法嗎? – VolkerK 2010-02-24 01:52:07

+0

從組織的角度來看,這絕對有用。我目前正在研究一個爲期2年的項目,在這個項目中,我們只是將功能轉儲到一個單獨的「庫」文件中,並且快速失控。回想起來,我真的希望我們可以將庫函數分組爲基於功能的靜態庫類(例如,可能只有一個URL相關函數的類,一個HTML相關函數的類...) – 2010-02-24 01:54:15

回答

6

我想說的主要優勢是重用能力和模塊化方面 - 如果你有功能您創建AB兩個不同的「庫」,他們都恰好有bar()的功能呢?作爲靜態方法,你可以調用A::bar()B::bar(),但作爲獨立的函數,你會遇到名稱衝突。

當然,你可以通過在所有獨立的函數名稱上添加奇怪的前綴來避免名稱衝突,但如果你打算這麼做,那麼將它包裝成一個簡單的類並將它們用作靜態函數。

在PHP 5.3+中,如果您願意,也可以使用名稱空間來實現此目的。

+0

Thankyou的簡潔摘要:) – andyjdavis 2010-02-24 05:22:16

2

爲了組織目的,namespaces已被添加到php 5.3+。

靜態方法可以訪問該類對象的protected/private成員。例如

class Foo { 
    protected function xyz() { 
    return 'abc'; 
    } 

    public static function bar(Foo $f) { 
    echo $f->xyz(); 
    } 
} 

$f = new Foo; 
Foo::bar($f); 

而且你可以使用相同的權限選項可以共享同一個類的不同方法之間的靜態性質,但保護他們免受「外部」。例如。

class Foo { 
    protected static $abc; 

    public static function set($x) { 
    self::$abc = $x*2; 
    } 

    public static function get() { 
    return self::$abc; 
    } 

} 
Foo::set(1); 
echo Foo::get(); 
+0

It我沒有想到靜態方法可以訪問類的實例上的私有/受保護的東西。這可能非常方便。 – andyjdavis 2010-02-24 05:10:52

相關問題