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

时间:2011-11-11 20:26:43

标签: php constants php4

我正在编写一个网站(在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."

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

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

问题2:我可以以不同的方式阻止PHP返回不存在的变量的名称吗?

问题3:是否应始终使用函数constant()返回PHP中的常量值?

3 个答案:

答案 0 :(得分:6)

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

  2. 如果您的错误报告处于适当级别,它会发出警告。这里最好的解决方案是确保您的代码使用正确的常量名称。

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

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

答案 1 :(得分:3)

反向顺序:

问题3:不  问题2:不是,但你可以做出调整。

因为(问题1 :) error_reporting。您配置PHP Web服务器隐藏一些错误。如果你添加

error_reporting(E_ALL);

到你的脚本头,你会得到一个

  

使用未定义的常量MY_CONST - 假设' MY_CONST'

错误。不幸的是,这是PHP历史悠久的问题,常量可以解释为字符串。

如果你不能保持一个常数被设置在第一位,你可以使用已定义的

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.');
}

最后一个tipp:去做一个errorhandler函数,甚至可以使用firephp

答案 2 :(得分:1)

好吧,你总是可以使用defined函数来确保常量存在。结合三元语句,您可以简单地回显空字符串,例如:

echo defined( VERSION ) ? VERSION : "";

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

defined()的PHP手册位于http://php.net/manual/en/function.defined.php