【问题标题】:Is it possible to redefine PHP constants?是否可以重新定义 PHP 常量?
【发布时间】:2011-03-25 01:47:45
【问题描述】:

是否可以重新定义类常量(在 PHP 中)?

例如

class B {
const C_ThisIsAConstant = 1;
}

class A extends B {
 self::C_ThisIsAConstant = 2;
}

【问题讨论】:

  • 您要求一个变量常量。这在术语上是矛盾的;-)

标签: php class constants


【解决方案1】:

不,当然不是。那么它们就不是“常数”了。

【讨论】:

  • @Porges 呵呵。我不会将 runkit 称为“重新定义”,而是将其称为“将语言打成血腥的纸浆”。
  • PECL 扩展未与 php 绑定,因此您必须安装 runkit 扩展。做这样的事情也很糟糕..这可能是您用于测试/基准测试代码或其他类似事情的东西,但/never/在生产中(与反射相同)。
  • 反射可用于例如 RPC。但是,没有理由重新定义常量,尤其是在此类 hack 中。
  • 即使这被接受了,但它是错误的 - 答案是“是”。
【解决方案2】:

你不能重新定义“常量”,因为它们是常量。

如果您尝试更改包含文件中定义的常量,则可以在包含之前定义常量:

define ("PROCESS_NAME", "MIKE");
/* ... code ... */
include ("/path/to/included_file.php"); // also defines "PROCESS_NAME"
/* ... code ... */

PROCESS_NAME 将是“MIKE”。

【讨论】:

  • 在阅读了关于 SO 的众多答案后,其中大部分都宣扬或陈述了显而易见的问题,这对我来说是迄今为止最有用的答案 - 它解决了问题(使用其他人的流行代码库,我没有想深入研究)。我几乎忽略了这个答案,因为开场白不仅适合说教/显而易见的类别,而且也不正确。在这种情况下,少即是多。
【解决方案3】:

首先:不,不能重新定义类常量。在每一种语言中都是不可能的,因为否则常量就不会是常量。

但是你正在做的事情是可能的,因为你没有重新定义类常量,而是为每个类定义一个唯一的常量。

【讨论】:

  • runkit 不是 PHP 核心。所以,是的,您可以重新定义常量——但前提是您安装了 PECL 扩展。
  • 无论是否有黑客攻击:我对提出坏主意感到不舒服。
  • Runkit 不是 hack,它是一个工具。
【解决方案4】:
<?php

class B {
    const C_ThisIsAConstant = 1;
}

class A extends B {
    const C_ThisIsAConstant = 2;
}

var_dump(A::C_ThisIsAConstant);

它输出int(2)

http://codepad.org/GQR9HI5M

【讨论】:

  • 这并没有重新定义B::C_ThisIsAConstant
【解决方案5】:

我已经在 github.com 上发布了我的框架 YAPAF。我们称之为阿尔法状态。总之,YAPAF 能够改变类常量的值(参见https://github.com/SchulteMarkus/YAPAF/blob/master/tests/ManipulateConstantTest.php)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多