为什么$ {0x0}是正确的?
下面的代码是完美的:
${0x0} = 'test'; echo ${0x0}; // prints "test"
但我不明白为什么。 0x0
(或0
,因为非hex的人称之为)是一个随机的容器,它可以是任何数字,但phpvariables不能以数字开头。 这里使用的{ }
什么特别之处,它们的局限性是什么?
首先, 0x0
在hex表示中只是一个常量0
,当与variablesvariables语法一起使用时,它被转换为string'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"
你是正确的乳清你说,它不是一个有效的variables名称 :
variables名称遵循与PHP中其他标签相同的规则。 有效的variables名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。 作为一个正则expression式,它将被这样表示:'[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'
这就是$0foo = 'Test';
的原因$0foo = 'Test';
触发parsing错误。
一些使用variables语法的快速testing表明,事实上,PHP似乎并不关心variables名,只要它们是string:
${'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"
我的猜测是前面提到的命名限制是由源代码parsing器而不是语言核心强加的。 在分析PHP代码时,它需要这样的规则来区分variables。 在内部,支持PHP的Zend引擎将variables作为哈希映射来处理:
一般而言,PHPvariables由两部分组成:标签(可能是符号表中的一个条目)以及实际的variables容器。
所以只要它收到一个有效的标签string,它很高兴。
从文档 :
也可以使用大括号来明确界定属性名称。 当属性包含一个数组,当属性名称由多个部分组成时,或者当属性名称包含不是有效的字符 (例如,来自json_decode()或SimpleXML)时,它们是最有用的。
对我来说,这意味着如果使用${...}
,那么在variables名称中可以使用什么字符没有限制。 不pipe你应该…
换句话说,在这种情况下,大括号内的所有内容都是一个string!
所以s 0x0
确实是0
的hex版本,但这里都是string! 这就是为什么${0x0}
或${0}
工作,其中$0
或$0x0
不会!
PHPparsing器提供了一个特殊的语法来从任何返回string的expression式(或可以被转换为string)创build一个variables名,例如:
<?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
的hex表示。
在迈克尔·罗宾逊(Michael Robin)所说的内容之上,在你的例子中,这也是有效的:
${0x0} = 'test'; $var = "0"; echo $$var; // prints "test"