【问题标题】:Redefining constants in PHP在 PHP 中重新定义常量
【发布时间】:2012-01-17 21:44:58
【问题描述】:

是否可以在 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();

这门课我没有写,但由于时间关系,我正在使用它。不知道为什么这个类的创建者defined使用用户数据而不是使用实例中的变量。

我知道常量应该是常量(显然!),但我正在寻找重新定义它们的技巧。

【问题讨论】:

  • 这听起来应该以另一种更好的架构方式来解决。
  • 包含用户数据的常量听起来很奇怪
  • 下一个:define(4, 42);
  • 重新定义常量意味着你基本上是在使用一个变量,所以一开始就坚持使用变量。

标签: php constants


【解决方案1】:

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

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

https://ideone.com/oUG5M9

【解决方案2】:

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

下面的 sn-p 将打印 int(5):

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

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

最后,这种行为允许创建非常混乱的情况,例如use const true as false;。

【讨论】:

  • 在我尝试的每个版本中都打印了int(3)(7.3.5、7.2.18、7.2.4、7.1.29、7.1.0、7.0.1、7.0.5、@98765433 、7.0.3、7.0.2、7.0.1、5.6.29)。
  • @WesleyGonçalves 感谢您的收获! sn-p 错过了“const”关键字。
【解决方案3】:

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

【讨论】:

  • PHP 5.6 引入了使用别名机制,使该语句为假。
【解决方案4】:

不,您不能重新定义常量(runkit_constant_redefine 除外),
这就是为什么称为 CONSTANT。

你在类中寻找的其实是一个数组格式的对象变量:-

class user
{
  public $user = array();

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

【讨论】:

  • 换句话说,答案是“是”。
  • 简答:否。长答:是。更长的答案:runkit_constant_redefine。
  • 简短回答:你不应该。长答案:你可以,但你仍然不应该。更长的答案:您可以使用此 hack,但您仍然不应该这样做。您正在寻找的是一个不断变化的常量;)
【解决方案5】:

如果你安装了runkit extension,你可以使用runkit_constant_redefine():

runkit_constant_redefine("name", "value");

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

【讨论】:

  • 还有uopz PHP 扩展也有类似的功能:uopz_redefine。 uopz_redefine() 也允许重新定义类常量。
猜你喜欢
  • 1970-01-01
  • 2019-05-27
  • 2011-02-14
  • 2012-12-06
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多