在PHP语言中,变量都是保存在哈希表中,称为变量符号表,其中变量名为哈希表的键,变量名对应的容器zval的指针为哈希表中的值。所有全局变量放在一张主符号表中(也就是数组$GLOBALS对应的哈希表)。PHP语言有个特性,变量在命名时,$变量标识符后不能以数字开头。例如我们在以下代码:
<?php
$111= "my";
?>
会报如下错误:Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in...
从错误的描叙来看,这是一个语法错误,于是我们推论对变量名合法性的判断应该是在编译时的语法分析阶段。
为了证明观点,我们可以试着在执行阶段定义一个数字字符开头的变量:
<?php
$a = 111;
$$a = "my"; //以变量$a的值作为变量名
echo $$a;
var_dump($GLOBALS);
?>
运行之后发现不报错,并且在全局符号表$GLOBALS中发现相关符号:
["a"]=>
int(111)
["111"]=>
string(2) "my"
这样我们就定义了一个全数字字符命名的变量,似乎违背了PHP的规则,但是确实做到了。
(读者可以试着输出$GLOBALS["111"]的值,虽然有值,但是结果却为NULL,这个是PHP中一个类型转换的特性)