2011-12-11 95 views
24

是否可以重新定義一個由define函數定義的php中的常量? 我有一個包含用戶數據的常量的類。我正在嘗試將該類用於多個用戶。在PHP中重新定義常量

define('ALLEGRO_ID', 'id'); 
define('ALLEGRO_LOGIN', 'login'); 
define('ALLEGRO_PASSWORD', 'passwd'); 
define('ALLEGRO_KEY', 'key'); 
define('ALLEGRO_COUNTRY', 123); 

$allegro = new AllegroWebAPI();     
$allegro -> Login(); 

我沒有寫這個類,但由於時間限制我使用它。我不知道爲什麼這個類的創建者defined的用戶數據而不是使用實例中的變量。

我知道常量應該是常量(顯然!),但我正在尋找一種技巧來重新定義它們。

+9

這聽起來像是應該以另一種更好的體系結構解決的問題。 –

+0

包含用戶數據的常量聽起來不可思議 –

+9

上一頁:'define(4,42);' – Zirak

回答

53

如果您已經安裝了runkit extension,您可以使用runkit_constant_redefine()

runkit_constant_redefine("name", "value"); 

在大多數但是,重新評估爲什麼要使用常量而不是更合適更好。

+1

還有[uopz](http://php.net/manual/en/book.uopz.php)具有類似功能的PHP擴展:[uopz_redefine](http ://php.net/runkit_constant_redefine)。 'uopz_redefine()'還允許重新定義類常量。 – matt

20

不,你不能重新定義一個常數(runkit_constant_redefine除外),
這就是爲什麼叫CONSTANT。

什麼,你是在類的尋找其實是在陣列格式的對象變量: -

class user 
{ 
    public $user = array(); 

    function load($user_id) 
    { 
    // etc 
    $this->$user[$user_id] = something_else; 
    } 
} 
+7

換句話說,答案是'是'。 – DaveWalley

+1

簡答:不需要長答案:是的。較長的回答:runkit_constant_redefine。 – Cullub

+2

簡答:你不應該。長答案:你可以,但你仍然不應該。較長的答案:你可以用這個黑客,但你真的不應該。你要找的是一個不變的常量;) – Edward

2

定義的常量值在整個程序中保持不變。如果你有這樣一個要求,你將來想改變這些值,那麼把這些值保存在PHP變量中。

0

在PHP 5.6+中,您可以在別名下導入常量。這種別名可以覆蓋已經存在的常量。

下面的代碼片段將打印int(5)

define('ALLEGRO_ID', 3); 
define('NEW_ALLEGRO_ID', 5); 
use NEW_ALLEGRO_ID as ALLEGRO_ID; 
var_dump(ALLEGRO_ID); 

這種機制可能是單元測試,或者魔法行爲是不能容忍其他地區合法的,但並不方便您的使用情況下,如果一個類存儲你的用戶設置會更有用。

最後,此行爲允許創建非常混亂的情況,如use const true as false;