是否可以重新定义由define
函数定义的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
的创建者是用户数据,而不是在实例中使用变量。
我知道常量应该是常数(显然!),但我正在寻找一种技巧来重新定义它们。
答案 0 :(得分:58)
如果您安装了runkit extension,则可以使用runkit_constant_redefine()
:
runkit_constant_redefine("name", "value");
然而,在大多数情况下,重新评估为什么使用常数而不是更合适的东西会更好。
答案 1 :(得分:22)
不,您无法重新定义常量(runkit_constant_redefine除外),
这就是为什么叫做CONSTANT。
您在课堂上寻找的实际上是数组格式的对象变量: -
class user
{
public $user = array();
function load($user_id)
{
// etc
$this->$user[$user_id] = something_else;
}
}
答案 2 :(得分:6)
在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;
。
答案 3 :(得分:3)
一旦定义的常量值在整个程序中保持不变。如果您希望在将来更改值时有这样的要求,请将这些值保存在PHP变量中。
答案 4 :(得分:3)
将第3个参数传递为true将对您有帮助
define('CONSTANT_NAME', 'constant_value', true);
print CONSTANT_NAME.PHP_EOL;
define('CONSTANT_NAME', 'constant_value2');
print CONSTANT_NAME.PHP_EOL;