2012-01-04 42 views
1

我目前是PHP OOP編程的初學者,並且想知道是否有人可以提供如何在實際Web應用程序中使用靜態屬性和方法的示例。使用PHP中的靜態屬性和方法進行OOP編程的示例

+2

人們普遍對使用靜態屬性感到不滿,因爲它是一個全局狀態,這使得很難跟蹤錯誤並使單元測試變得困難。當然也有例外。 – dqhendricks 2012-01-04 23:34:34

+1

「靜態」類方法有很多用途。儘管如此,這並不意味着你一定會一直使用它們。嘗試學習/遵循面向對象的模式,他們遲早會出現。例如,工廠模式使用它們很多。或者只是一個類在內部使用的實用函數,但也可以獨立使用。 – deceze 2012-01-04 23:36:57

+0

有沒有一個網站,你建議我去學習OO /工廠模式 – 12japerk 2012-01-04 23:43:34

回答

5

儘管在評論中指出了靜態問題,但它們確實有一些用處。

我發現很有用的一個是「命名構造函數」。

通常一個類會有一個構造函數。但是如果這個類可以用幾種不同的方式初始化呢?

例如,也許您的應用程序支持創建用戶的電子郵件地址,或從Facebook的用戶ID ...

class User { 
    public function __construct($emailOrFbUserId) { } 
} 

正如你可以在上面看到,它可能是一個有點混亂到什麼參數在構造函數中是當你使用類。

相反,通過編寫它像這樣...

class User { 
    private function __construct() { } 

    public static function fromEmailAddress($email) { 
     $user = new User(); 

     //assuming there's a private field called email 
     $user->email = $email; 
     return $user 
    } 

    public static function fromFacebookUserId($id) { 
     ... 
    } 
} 

//usage example 
$user = User::fromEmailAddress('[email protected]'); 

......它突然更有道理。

+0

提取您稱爲「命名構造函數」的方法並將它們移到UserFactory類中會更好嗎? – 2012-01-05 00:27:12

+0

您是否知道這是網站如何使用fb數據登錄或註冊用戶的網站? – 12japerk 2012-01-05 00:29:57

+2

@DavideGualano有趣的想法,但幾十年的OOP說工廠方法應該是他們創建的類中的靜態方法。擁有單獨的課程會導致各種問題,例如您的工廠將無法訪問私有或受保護的屬性。創建子類也會變得非常複雜,特別是一旦你有子類的子類。它違背了一般的「複雜的代碼是錯誤的代碼」的理論。 – 2012-01-05 00:33:44