2012-11-28 97 views
-3

PHP 5.3之前,我用的是下面的自制函數來創建枚舉:枚舉在PHP 5.3

function enum() 
{ 
    for($enums = func_get_args(), $enum = reset($enums), $i = 1; $enum; $enum = next($enums), ++$i) 
    { 
     if(defined($enum)) throw new Exception($enum.' is already defined.'); 
     else define($enum, $i); 
    } 

} // enum() 

然後:

enum('CONST0', 'CONST1', 'CONST2', ...); 

用PHP 5.3我能做到這一點使用常量代替的定義受益於命名空間。有沒有一種方法可以修改這個函數來使它使用const關鍵字?

此外,我只使用5.3使我的代碼看起來更乾淨,如果必須有性能影響(即使用eval或類似的東西),我會堅持使用舊的定義。

我已經看過這個問題:PHP and Enumerations但我沒有找到我要找的東西。

+0

如果你downvote,請至少可以解釋爲什麼。這是沒有建設性和愚蠢的。 – Virus721

+2

你能解釋一下你的意思嗎?我可以修改這個函數來使用const關鍵字嗎?_,因爲這是你問的唯一問題。 – eisberg

+0

我不明白這個問題中有什麼不明確的地方。讓我以不同的方式提問:我可以使用const關鍵字而不是此函數中的define函數創建僅存在於調用enum函數的名稱空間中的常量嗎? – Virus721

回答

1

有條件地使用const關鍵字[see this very high voted answer]。

如果你想命名空間你的常量,最好的辦法是讓它們成爲一個類的靜態字段,如果需要的話,利用魔術__get__set

編輯:當然,在靜態環境中沒有魔法設置者/獲取者,無論如何,您都可以使用靈活的解決方案。

+0

感謝您的回答。我現在明白了,編譯時間僅限於const。使用const的煩人的事情是,你手動必須管理nums的值:$ i = 0; const CONST0 = ++ $ i; const CONST1 = ++ $ i;等等......我也想避免這種情況。編輯:等待沒有它也行不通,必須硬編碼1,2,3 ... – Virus721

1

我會盡力回答你的問題:有沒有辦法修改這個函數使其使用const關鍵字?

簡短的回答:沒有

龍答案:是的,你可以,但只能在一個非常尷尬的方式:

<?php 
function enum() { 
    for($enums = func_get_args(), $enum = reset($enums), $i = 1; $enum; $enum = next($enums), ++$i) { 
     eval('const ' . $enum . ' = ' . $i . ';'); 
    } 
} 

enum('CONST0', 'CONST1', 'CONST2'); 

測試在http://3v4l.org/ontRN

+0

是的,我已經爲此而努力,但我認爲這是不值得的額外性能常量。還是要謝謝你的幫助。 – Virus721

+0

表現? :-O你想定義多少個常量? – eisberg

+0

沒有那麼多,但我總是被告知eval是未優化和不乾淨。 – Virus721