我正在编写一个网站(在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中的常量值?
答案 0 :(得分:6)
如果您尝试使用不存在的常量,PHP会自动假定它是字符串,这就是您看到VERSIONXXX
的原因。
如果您的错误报告处于适当级别,它会发出警告。这里最好的解决方案是确保您的代码使用正确的常量名称。
如果您知道常量的名称,最简单/最好直接使用它。 echo MY_CONSTANT
如果您不知道常量的名称(例如,它的名称在变量中),请使用constant()
:
$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