2012-08-14 125 views
5

我想衡量人們對使用靜態類而不是名稱空間的意見。我來自C++背景,非常喜歡它的語法以及它如何讓你構造代碼。我最近決定,我需要將我的代碼分成邏輯單元而不是文件。例如,我喜歡像User :: login to user_login這樣的調用。所以,我做了一些Google搜索,並發現PHP具有名稱空間。我的解脫並沒有持續很長時間,我真的不喜歡它的語法;它給我的函數調用增加了更多的混亂。所以,此刻我正在使用靜態類來模擬名稱空間。這有什麼缺點嗎?PHP靜態類或命名空間

我在PHP Namespaces vs Classes with static functions處發現了一個類似的問題,但沒有討論太多。

此外,有沒有辦法避免以下情況:我以爲這將是確定調用同一類的功能,而無需指定名稱

class Test { 
public static void myFunc() { 
    Test::myOtherFunc(); 
} 
public static void myOtherFunc() { 

} 
} 

,但顯然不是。是否有任何解決方法(例如在C++中使用關鍵字)。

+0

'self ::'和'$ this->'在PHP中用於分別調用您自己的靜態和實例方法。 – 2012-08-14 03:50:21

+0

所以沒有辦法讓資格是隱含的?即檢查當前類的功能? – user1520427 2012-08-14 03:53:00

+1

不,但我發現明確是一件好事:) – 2012-08-14 03:54:25

回答

5

無獨有偶我實際上已經運動到完全相反的方向:

  1. 使用的命名空間來組織,其中,我會以其他方式使用靜態類
域類(或功能)
  • 使用依賴注入

    用靜態類來模擬命名空間的事情是,你不能在多個文件中組織它們,一切都必須在一個文件中定義;這很可能取決於個人的品味。

    關於靜態類的另外一件事是,你在沒有任何狀態的情況下啓動,並且緩慢地進行一些狀態管理,最終導致一些奇怪的鎖定依賴。狀態應該保留用於實例。目前我唯一值得注意的靜態類是站點範圍的配置。

    最後,靜態類中的自引用是顯式的,而在命名空間中,它的工作方式與C++完全相同:您可以指定函數名稱並首先在命名空間中查找它。

  • +0

    我喜歡命名空間的概念,以及它們如何讓您管理代碼,正如您所說,您可以將它們組織到多個文件中。我唯一真正的抱怨是笨拙的語法。我認爲沒有必要使用\並去除與其他語言的一致性。 – user1520427 2012-08-14 04:07:41

    +0

    @ user1520427我知道你的感受,它不是一個好看的人,但把它看作是一個目錄結構的東西,它是有道理的:)默認的自動加載器實際上也是這樣使用它。 – 2012-08-14 04:09:36

    4

    如果從代碼結構的角度來看,靜態類方法和名稱空間函數沒有區別。它們都在全球範圍內結束。唯一不同的是,用靜態類方法,你試圖僞造OOP。

    因此,如果您真正需要的是獨立/實用功能,最好使用名稱空間函數。命名空間用於分組事物(包括函數和類)。

    至於你User::login()的例子,這將是一個不好的做法。相反,你應該有一個真正的對象,它能夠包含狀態。

    $mapper = new UserMapper; 
    $user = new User; 
    $user->setNickname($name); 
    
    $mapper->fetch($user); 
    
    if ($user->hasPassword($password)) 
    { 
        $user->setLastLogin(time()); 
    } 
    else 
    { 
        // log the access attempt 
        // set error state 
    } 
    
    $mapper->save($user); 
    

    底線是:如果您使用靜態結構(函數或方法),它不是OOP。你只是在僞造它。相反,您應該使用真實的OOP,並使用dependency injection

    如果您的代碼在整個地方使用靜態方法和變量,它會導致類之間的緊密耦合,請添加global state並使harder to maintain and test成爲您的代碼庫。這不是PHP特定的。

    相關問題