我可以在 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)
如果您有小型个人项目,这可能不是一个大问题,但由于常量始终位于全局命名空间中,因此在具有大量外部依赖项的大型项目中,一些常量可能会相互冲突。如果您启用了 PHP 通知,您可能会更快地发现这个问题。另一种选择是始终创建正确命名的常量,名称不太可能与其他常量冲突。
define("MY_COOL_LIBRARY_DEVELOPMENT", false);
据我所知,我们无法在 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)
如果您有小型个人项目,这可能不是一个大问题,但由于常量始终位于全局命名空间中,因此在具有大量外部依赖项的大型项目中,一些常量可能会相互冲突。如果您启用了 PHP 通知,您可能会更快地发现这个问题。另一种选择是始终创建正确命名的常量,名称不太可能与其他常量冲突。
define("MY_COOL_LIBRARY_DEVELOPMENT", false);