2013-05-30 119 views
13

首先:我試着谷歌它,但我大多隻找到關於如何在常量和其他無關信息中定義數組的討論。只包含常量的PHP類

我有一個解決方案的問題,使我的代碼更可讀性(和漂亮),只是發生在我身上。基本上我有大多數函數返回一個表示成功的狀態碼,或者在出現錯誤的情況下返回一個錯誤碼。對於這一點,我做了一個叫「的StatusCode」類,它包含唯一不變的,就像這樣:

<?php 
class StatusCode { 
    const success = 0; 
    const badArgument = -1; 
    const badQuery = -2; 
    const outOfMana = -3; //Really just for demonstration purposes 
    ... 
} 

的目的是使幻數從我的代碼消失,並明確了什麼問題,而不必尋找一個解釋某處:

if (mana > 10) { 
    //Do some magic 
    return StatusCode::success; 
} 
else { 
    //Oh god this is not good! 
    return StatusCode::outOfMana; 
} 

它還應該消除意外使用重複錯誤代碼的可能性。 我很確定這會給我的應用程序增加一個小的開銷,但是使我的代碼更易於理解。有沒有一些地球破碎的理由不這樣做?也許有更好的方法去解決它?

(我已經避免了define(CONSTANT, "value")方法,因爲它顯得不那麼漂亮,這是給我的德式鍵盤:)上寫一個麻煩)

+7

沒有理由不去做你所做的事情。如你所說,它使你的代碼更具可讀性。至於增加開銷,即使它是真的,它也是最小的開銷。至於更好的方法,通過使用接口來定義常量,已經做了許多變化。 TL; DR - 你做的很好。 –

+1

完全同意@ N.B。說過。我這篇文章唯一的問題是,它應該在代碼審查,而不是在這裏;) – Prisoner

+1

在編碼風格的這個小角落,你的選擇是絕對最好的。而在談論風格時,人們往往不會說「絕對最好」。 ;-)順便說一句,你可能想讓這個類是'abstract'或'final'作爲它不應該被使用的附加提示。不幸的是,它不可能是兩個,這將達成協議。 – Jon

回答

17

在Java等語言中,這是一種常用的方式命名空間常量來避免命名碰撞。見here;

,我會實現這樣一個類的方法是這樣的」

// make this final so no one can extend it 
final class Errors{ 
    const SUCCESS = 0; 
    const BAD_ARGUMENT = -1; 
    const BAD_QUERY = -2; 
    const OUT_OF_MANA = -3; 

    // make this private so noone can make one 
    private function __construct(){ 
     // throw an exception if someone can get in here (I'm paranoid) 
     throw new Exception("Can't get an instance of Errors"); 
    } 
} 
+1

爲什麼我沒有想到僅僅使構造函數保持私有而不是使用抽象?謝謝,你的例子涵蓋了「不要實例化」和「不擴展」。 – Anpan

1

這有名字空間的優勢和分組常量。你可以使用反射在該類遍歷定義的常量,其例如,您可以驗證某個值是某個常數組的值(使窮人的常量類型提示成爲可能)。

缺點是您有點濫用類(儘管只是略微)純粹主義者可能不喜歡那個,在山姆中不使用的常數e類應該是全局常量;你甚至可以在PHP 5.3+中將它們命名爲\StatusCodes\SUCCESS

選擇是你的,真的。

+0

我想這有點像用打火機取下瓶蓋。打火機不是爲此目的而設計的,但它工作得很好:) 如果反對這種做法的唯一理由是:「但是班級並沒有被這樣做」,但它還有其他幾個優點,那麼我認爲沒關係。 – Anpan

+0

排序,是的。 :) – deceze

1

創建靜態類將解決您的問題,並避免造成StatusCode

命名空間可用於多個實例,如果你認爲你的應用程序可以有多個的StatusCode類,但仍然會的StatusCode是靜態的。

如果你想使用Singleton模式,這將工作太

選擇是你的!

+0

其實我根本不想要任何實例。 – Anpan

+0

從像這樣的「class StatusCode」類定義中可以完成多個實例,因爲內存管理將基於此,所以更好地定義靜態類StatusCode並將其用作StatusCode :: * –