何时以及如何在PHP中使用常量?

8

我目前正在编写一个网站(使用PHP4)。我计划将不会在运行时更改的值保存在常量中。例如,登录数据库的版本号。

问题1:将数据保存在常量中是否可能出现任何(安全相关的)问题?

我目前这样定义和调用常量:

define("VERSION",   "1.0");
echo "Current version: ".VERSION."."; // Result: "Current version: 1.0."

有一件事情让我很烦恼:如果常量未定义,则返回的是“错误”的变量名称,而不是例如NULL

define("VERSION",   "1.0");
echo "Current version: ".VERSIONXXX."."; // Result: "Current version: VERSIONXXX."

我发现一个解决方案,当我误输入错误的常量名称时,可以使用函数constant()来获取错误消息和返回值“NULL”:

define("VERSION",   "1.0");
echo "Current version: ".constant("VERSIONXXX")."."; // Result: "Current version: ."

问题2:我能以其他方式防止PHP返回不存在变量的名称吗?

问题3:在PHP中,常量的值是否总是使用函数constant()返回?


4
你们为什么还在使用不再被维护的 PHP4?有什么原因吗? - danielrsmith
3个回答

6
  1. 如果您尝试使用不存在的常量,PHP会自动假设它是一个字符串,这就是为什么您会看到VERSIONXXX的原因。

  2. 如果您的错误报告级别设置正确,那么它会抛出一个警告。最好的解决方法是确保您的代码使用正确的常量名称。

  3. 如果您知道常量的名称,直接使用它是最简单/最好的方法。echo MY_CONSTANT
    如果您不知道常量的名称(例如,它的名称存储在变量中),请使用constant()

    $name = 'MY_CONSTANT';
    echo constant($name);

3

逆序:

问题3:不行 问题2:不完全是,但你可以进行调整。

原因在于(问题1):error_reporting。你的PHP Web服务器已配置为隐藏某些错误。如果你添加

error_reporting(E_ALL);

将以下代码添加到您的脚本头部,您将会得到一个

使用未定义常量MY_CONST - 假定为'MY_CONST'

错误。不幸的是,这是PHP漫长历史带来的问题,常量可能被解释为字符串。

如果你不能确定首先设置了一个常量,你可以使用defined。

if(defined('MY_CONSTANT') {
     //do something
}

但是我的个人意见是不应该有太多需要使用这种方法的情况,因为单独使用常量一词已经暗示了它的存在是保证的。我所能想到的唯一例外就是典型的标题测试。

if(!defined('MY_APP_IS_PRESENT')) {
    die('You can not call this file on its own, please use index.php.');
}

还有一个小贴士:去创建一个错误处理器函数,甚至可以使用firephp


1

你可以使用defined函数来确保常量存在。结合三元运算符,你可以简单地输出一个空字符串,例如:

echo defined( VERSION ) ? VERSION : "";

这不是最好的答案,但可行吗?

defined() 的 PHP 手册在 http://php.net/manual/zh/function.defined.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接