以下代码完美运行:
${0x0} = 'test';
echo ${0x0}; // prints "test"
但我无法弄清楚原因。 0x0
(或0
,非十六进制人称之为)是一个随机容器,它可以是任意数字,但php变量不能以数字开头。这里使用的{ }
有什么特别之处,它们的局限性是什么?
答案 0 :(得分: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"
你说的不是valid variable name:
,你是对的变量名遵循与PHP中其他标签相同的规则。一个有效的 变量名以字母或下划线开头,后跟任意名称 字母,数字或下划线的数量。作为正则表达式, 它将被表达为:'[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'
这就是$0foo = 'Test';
触发解析错误的原因。
使用variable variables syntax进行的一些快速测试表明,事实上,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代码时,它需要这样的规则来区分变量。在内部,Zend引擎支持PHP handles variables作为哈希映射:
PHP变量通常由两部分组成:标签,即 例如,可能是符号表中的条目和实际的条目 变量容器。
因此,只要它收到标签的有效字符串,就很高兴。
答案 1 :(得分:25)
也可以使用大括号来清楚地界定属性名称。当访问包含数组的属性中的值时,当属性名称由多个部分组成时,它们最有用;或者当属性名称包含其他无效的字符时 (例如,来自json_decode())或SimpleXML)。
对我而言,这意味着如果您使用${...}
,则对变量名中可能使用的字符没有限制。不管你应该......
答案 2 :(得分:4)
换句话说,在这种情况下花括号内的所有内容都是一个字符串!
所以0x0
确实是0
的十六进制版本,但这里都是字符串!这就是${0x0}
或${0}
工作的原因,$0
或$0x0
不会!
答案 3 :(得分:3)
PHP解析器提供了一种特殊的语法,可以从任何返回字符串的表达式(或者可以转换为字符串)创建变量名,例如:
<?php
define('A', 'aaa');
${' _ '} = 'blah';
${'test' . A . (2 + 6)} = 'var';
echo ${' _ '}; // blah
echo ${'testaaa8'}; // var
${'123'} = 'blah';
echo ${100 + 23}; // blah
function returnVarName() {
return 'myVar';
}
$myVar = 12;
echo ${returnVarName()}; // 12
此语法也可用于对象属性:
$object->{' some property ... with strage name'};
0x0
只是0
字面值的十六进制表示。
答案 4 :(得分:2)
除了@Michael Robinson所说的,在你的例子中,这也是有效的:
${0x0} = 'test';
$var = "0";
echo $$var; // prints "test"