我可以在 PHP 中重新定义常量而不会出错

I can redefine constant in PHP without getting an error

据我所知,我们无法在 PHP 中重新定义常量。 所以如果我这样做:

define("DEVELOPMENT", true);

理论上我不能重新定义它:

define("DEVELOPMENT", false); (or) const DEVELOPMENT = false;

问题是 PHP 让我来做吧。它让我可以重新定义常量而不会引发任何错误。 显示错误(我收到任何其他错误):

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

如何才能使常量无法重新定义并在我尝试时出现错误?

我的PHP版本是7.2.17

报告所有php错误

error_reporting(E_ALL);

报告所有 php 错误,但通知除外

error_reporting(E_ALL & ~E_NOTICE);

在你的例子中,你正在重新定义一个已经定义的常量显示 PHP 抛出一个通知。通过使用

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

您告诉 PHP 不要报告任何类型的通知或警告。你应该删除它们。
要获得所有警告和通知,请使用

error_reporting(E_ALL);

更多信息请参考官方doc,并查看示例。

没有报错,但是有提示

Notice: Constant DEVELOPMENT already defined

这就是为什么永远不要关闭通知很重要的原因。

error_reporting(E_ALL); // E_ALL reports all problems including notices, warnings and deprecations

当然,因为它是一个常量,第二个define变成了non-executable段代码,因为你不能重新定义这个常量,所以这个值仍然是最初定义的。

define("DEVELOPMENT", true);
define("DEVELOPMENT", false);

var_dump(DEVELOPMENT); // prints out bool(true)

在线试用:https://3v4l.org/7i8XL

如果您有小型个人项目,这可能不是一个大问题,但由于常量始终位于全局命名空间中,因此在具有大量外部依赖项的大型项目中,一些常量可能会相互冲突。如果您启用了 PHP 通知,您可能会更快地发现这个问题。另一种选择是始终创建正确命名的常量,名称不太可能与其他常量冲突。

define("MY_COOL_LIBRARY_DEVELOPMENT", false);