2011-06-23 64 views
36

你可以在PHP中定義或更改一個常量嗎?你可以不定義或更改PHP中的常量嗎?

+41

換句話說,你想要一個常量是一個變量?可能想再想一想。 –

+4

@MarcB但適當的,給出OP的用戶名。 – abligh

+0

@MarcB OP很清楚地認識到這個問題的諷刺意味(他/她只是爲了發表這個問題而作了一個解釋),但是卻認真地提出了這個問題。這聽起來比較合理的提出像_「你能取消定義的東西PHP的創造者決定把‘常量’?一個」 _ –

回答

10

號一旦常數被定義,它可以永遠不會改變或未定義。

+1

這是不正確的。 runkit擴展(如另一個答案中提到的)自PHP 4以來已經允許它。最近,uopz擴展還允許從PHP 5.4開始。 –

14

如果你絕對需要這樣做(雖然我不會像其他人所說的那樣推薦它),但你總是可以使用Runkit。

http://www.php.net/manual/en/function.runkit-constant-redefine.php

http://www.php.net/manual/en/function.runkit-constant-remove.php

+22

像這樣的廢話是這裏有太多糟糕的PHP代碼的原因之一。以這種方式顛覆語言結構是一個可怕的想法,並且對做這件事的開發者反映不佳。 –

+2

Runkit是一個可選的PHP擴展,我從未在任何Web主機上安裝過。 – gnud

+10

@George Cummins我同意你的意見!儘管如此,OP並沒有提到他們在做什麼,或者他們爲什麼希望重新定義常量,而其他人可能會在Runkit之類的某些非常實驗性的語言黑客工具之後,所以我想我會發布它。 –

4

其他海報是正確的 - 你不能做到這一點。但是也許你可以將你的定義轉移到你知道常數的最佳值的地方。

也許你定義常量在大名單:

define('STRING1','Foo'); 
define('STRING2', 'Bar'); 
define('STRING3', 'Baz'); 

,你想一旦你發現了一個條件改變STRING2的價值。一種方法是推遲定義直到你知道正確的設置。

define('STRING1','Foo'); 
// define('STRING2', 'Bar'); -- wait until initialization 
define('STRING3', 'Baz'); 

... 


if (condition) { 
    define('STRING2', 'Bar type 2'); 
} else { 
    define('STRING2', 'Bar type 1'); 
} 

邏輯設置STRING2甚至可能在不同的文件中,稍後在處理中。

18

我知道這是太遲了......但這裏是一兩件事,可能幫助一些人...

在我的「Application.php」文件(其中我定義我所有的常量和包括我所有的腳本)我做這樣的事情:

if(!defined("LOGGER_ENABLED")){ 
define("LOGGER_ENABLED", true); 
} 

所以通常情況下,每一個劇本是會得到啓用日誌記錄...但是,如果在一個特定的腳本,我不希望這種行爲,我可以簡單地做這之前我包括我的Application.php:

define("LOGGER_ENABLED", false); 
+0

沒有看到你的整個應用程序,這可能是一個不公平的假設,但「覆蓋」你自己的系統聽起來有點哈克。難道你不能重新設計你的應用程序/框架,以便更好地管理如果記錄器應該啓用或不基於更具體或邏輯的東西?事實上,這聽起來非常花哨,使用和管理,而在頂部聽起來像是很少使用。這是一個有效的答案,可以爲問題添加潛在的有用信息,所以不會下調,但它可能會促進不良做法。 – James

+0

@帕特里克,是的,但如果有人想改變已經設定的價值,那麼我認爲尼爾斯·魯克斯頓的回答最適合。希望你記得我。 –

+2

這應該被接受,因爲它提供了一個可行的解決方案。這也是通常的做法,例如。 C編碼,所以我沒有看到它在PHP中使用的問題 – Sinisa

4

正如其他地方沒有提到的那樣,uopz擴展允許通過uopz_undefine()爲PHP 5.4+刪除一個常量。

+1

向下投票者:如果我寫的是錯的,請說出來或更正! –

相關問題