2011-12-11 133 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;