PHP中常量的重新定义

PHP中常量的重新定义,php,constants,Php,Constants,是否可以在php中重新定义由define函数定义的常量? 我有一个包含多个常量的类,其中包含用户数据。我正在尝试为多个用户使用该类 define('ALLEGRO_ID', 'id'); define('ALLEGRO_LOGIN', 'login'); define('ALLEGRO_PASSWORD', 'passwd'); define('ALLEGRO_KEY', 'key'); define('ALLEGRO_COUNTRY', 123); $allegro = new Allegr

是否可以在php中重新定义由
define
函数定义的常量?
我有一个包含多个常量的类,其中包含用户数据。我正在尝试为多个用户使用该类

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();
我没有编写这个类,但由于时间限制,我正在使用它。我不知道这个类的创建者为什么定义用户数据而不是使用实例中的变量


我知道常数应该是常数(很明显!),但我正在寻找一种重新定义它们的技巧。

不,你不能重新定义常数(除非使用),
这就是为什么我们称之为常数

您在类中查找的实际上是数组格式的对象变量:-

class user
{
  public $user = array();

  function load($user_id)
  {
    // etc
    $this->$user[$user_id] = something_else;
  }
}
如果已安装,则可以使用:


然而,在大多数情况下,最好重新评估为什么使用常量而不是更合适的东西。

常量值一旦定义,在整个程序中保持不变。如果您有这样的需求,希望在将来更改这些值,那么请将这些值保存在PHP变量中。

在PHP5.6+中,您可以在别名下导入常量。这样的别名可以覆盖已经存在的常量

以下代码段将打印
int(5)

这种机制可能在单元测试中是合法的,或者在允许魔术行为的其他领域中是合法的,但对于您的用例来说并不方便,在用例中,存储用户设置的类将更有用


最后,此行为允许创建非常混乱的情况,如
将const true用作false

将第三个参数作为true传递将有助于您

define('CONSTANT_NAME', 'constant_value', true);
print CONSTANT_NAME.PHP_EOL;
define('CONSTANT_NAME', 'constant_value2');
print CONSTANT_NAME.PHP_EOL;

这听起来像是应该以另一种更好的架构方式来解决的问题。包含用户数据的常量听起来很奇怪:
define(4,42)重新定义常量意味着您基本上使用的是一个变量,所以只需从变量开始。换句话说,答案是“是”。简短回答:否。长回答:是。长答案:runkit\u constant\u重定义。短答案:你不应该。长回答:你可以,但你仍然不应该。更长的回答:你可以用这个黑客,但你仍然真的不应该。你要找的是一个变化无常的常数;)还有一个PHP扩展,它具有类似的函数:
uopz_redefine()
也允许重新定义类常量。PHP5.6引入了一种使用别名机制,使该语句为false。它在我尝试的每个版本中都打印了
int(3)
7.3.5
7.2.18
7.2.4
7.1.0
7.0.1
7.0.5
7.0.4
7.0.3
7.0.2
7.0.1
7.0.1
5.6])>感谢康萨尔维·维萨尔夫的“抓捕”康斯特雷根代码片段关键字。不过,这很有趣
define('ALLEGRO_ID', 3);
define('NEW_ALLEGRO_ID', 5);
use const NEW_ALLEGRO_ID as ALLEGRO_ID;
var_dump(ALLEGRO_ID);
define('CONSTANT_NAME', 'constant_value', true);
print CONSTANT_NAME.PHP_EOL;
define('CONSTANT_NAME', 'constant_value2');
print CONSTANT_NAME.PHP_EOL;