为什么$ {0x0}正确?

Vla*_*eda 37 php

以下代码完美运行:

${0x0} = 'test';
echo ${0x0}; // prints "test"
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚为什么.0x0(或者0,非十六进制人称之为)是一个随机容器,它可能是任何数字,但php变量不能以数字开头.{ }这里使用的有什么特别之处,它们的局限性是什么?

Álv*_*lez 30

首先,当与变量变量语法一起使用时,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"
Run Code Online (Sandbox Code Playgroud)

你说它不是一个有效的变量名称,你是对的:

变量名称遵循与PHP中其他标签相同的规则.有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线.作为正则表达式,它将表示为:'[a-zA-Z_\x7f-\xff] [a-zA-Z0-9_\x7f-\xff]*'

这就是$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"
Run Code Online (Sandbox Code Playgroud)

我的猜测是上述命名限制是由源代码解析器而不是语言核心强加的.在分析PHP代码时,它需要这样的规则来区分变量.在内部,支持PHP的Zend引擎将变量作为哈希映射处理:

通常,PHP变量由两部分组成:标签,例如,可能是符号表中的条目,以及实际的变量容器.

因此,只要它收到标签的有效字符串,它就很高兴.


Mic*_*son 25

文档:

也可以使用卷曲括号来清楚地界定属性名称.当访问包含数组的属性中的值,属性名称由多个部分组成时,或者属性名称包含其他方式无效的字符时(例如,来自json_decode()或SimpleXML),它们最有用.

对我而言,这意味着如果您使用${...},则对变量名中可能使用的字符没有限制.不管你应该......

  • 正是.变量名称不必是有效的标识符.只有$ identifier语法需要这个. (2认同)
  • 真棒,这正是我想念的那一点,谢谢! (2认同)