为什么$ {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不会!

链接地址: http://www.djcxy.com/p/59543.html

上一篇: Why is ${0x0} correct?

下一篇: Use of Brackets