为什么$ {0x0}是正确的?
以下代码完美运行:
${0x0} = 'test';
echo ${0x0}; // prints "test"
但我不明白为什么。 0x0
(或0
,因为非十六进制人称它为)是一个随机容器,它可以是任何数字,但php变量不能以数字开头。 这里使用的{ }
什么特别之处,它们的局限性是什么?
首先, 0x0
在十六进制表示中只是一个常量0
,当与变量变量语法一起使用时,它将转换为字符串'0
':
var_dump(0x0===0); // prints "bool(true)"
${0x0} = 'test';
echo ${0x0}; // prints "test"
echo ${'0'}; // prints "test" as well
var_dump(get_defined_vars()); // contains ["0"] => string(4) "test"
你说得对,你说它不是一个有效的变量名:
变量名称遵循与PHP中其他标签相同的规则。 有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。 作为正则表达式,它将如此表示:'[a-zA-Z_ x7f- xff] [a-zA-Z0-9_ x7f- xff] *'
这就是$0foo = 'Test';
的原因$0foo = 'Test';
触发解析错误。
一些用变量语法进行的快速测试表明,事实上,PHP似乎并不关心变量名,只要它们是字符串:
${'123 abc xyz '} = 'Test';
echo ${'123 abc xyz '}; // Test
echo ${'123 abc xyz '}; // PHP Notice: Undefined variable: 123 abc xyz in ...
var_dump(get_defined_vars()); // ["123 abc xyz "] => string(4) "Test"
我的猜测是前面提到的命名限制是源代码解析器而不是语言核心。 在分析PHP代码时,它需要这样的规则来区分变量。 在内部,为PHP提供动力的Zend引擎将变量作为哈希映射处理:
一般而言,PHP变量由两部分组成:标签(可能是符号表中的条目)和实际变量容器。
因此,只要它收到标签的有效字符串,就很高兴。
从文档:
也可以使用大括号来明确界定属性名称。 当属性包含一个数组,或者属性名称由多个部分组成时,或者当属性名称包含不是其他有效的字符 (例如,来自json_decode()或SimpleXML)时,它们是最有用的。
对我来说,这意味着如果使用${...}
,那么对于可以在变量名中使用哪些字符没有限制。 然而,你是否应该......
换句话说,在这种情况下,大括号内的所有内容都是一个字符串!
所以s 0x0
确实是0
的十六进制版本,但这里都是字符串! 这就是${0x0}
或${0}
工作的原因,其中$0
或$0x0
不会!
下一篇: Use of Brackets