PHP 问题:定义常量
问题
下面的代码有什么作用?
define("MY_CONSTANT",array(1,2,3,4,5));
回答
如果运行此代码,它将产生以下错误:
Warning:Constantsmayonlyevaluatetoscalarvaluesintest.phponlinex
这是因为只能将标量值分配给常量。标量值是任何整数、浮点数、字符串或布尔值,不包括数组、对象或资源。尝试将任何非标量值设置为常量会产生此错误。
如果我们继续var_dump()上面定义的常量,我们会得到一个包含“MY_CONSTANT”的字符串。这是因为如果您尝试检索任何尚未设置的常量值,PHP将尝试将其计算为字符串。这意味着如果您尝试对常量进行简单的布尔测试(参见下面的示例),它将评估为真。
if (MY_CONSTANT) { echo 'constant set, or not...'; }
我们可以通过几种方式测试常数的存在。我们已经知道任何未定义的常量都会被转换为字符串,因此我们可以通过在常量和常量名称的字符串之间进行类型比较来测试这一点。如果定义了常量,那么这将等于false。
var_dump(MY_CONSTANT==='MY_CONSTANT');//trueifconstantnotset
但是,当我们这样做时,我们会收到以下关于使用未定义常量的通知,并且PHP已将其转换为字符串。
Notice:UseofundefinedconstantMY_CONSTANT-assumed'MY_CONSTANT'intest.phponlinex
PHP内置函数defined()可用于测试常量值是否存在。这接受一个常量名称的字符串,并将返回一个布尔值,显示该常量是否已设置。这也避免了尝试常量本身并在未定义时得到通知的需要。
var_dump(defined('MY_CONSTANT'));//false
有几种方法可以绕过只允许在常量中使用标量值的限制。第一种方法是在serialize()将数组设置为常量之前先将其转换为字符串。
define("MY_CONSTANT", serialize(array(1,2,3,4,5))); var_dump(defined('MY_CONSTANT')); //printstrue print_r(unserialize(MY_CONSTANT));
我们也可以json_encode()在这里使用,这将具有相同的效果。这可能不是设置常量值的最佳方式,尽管它在PHP中是完全允许的。使用数组获取常量的另一种方法是在类中使用静态变量。这实际上是一个常量,因为它不会(至少不应该)在脚本执行期间更改。
class Constants { public static $myConstant = array(1, 2, 3, 4, 5); } print_r(Constants::$myConstant);
这将完整打印出数组。
请注意,您不能将数组设置为类中的常量,因为您将收到致命错误而不是警告。例如,以下脚本。
class Constants { const MY_CONSTANT = array(1, 2, 3, 4, 5); } print_r(Constants::MY_CONSTANT);
运行时会产生以下错误。
Fatalerror:Arraysarenotallowedinclassconstantsintest.phponlinex