繁体   English   中英

为什么$ {0x0}正确?

[英]Why is ${0x0} correct?

以下代码完美运行:

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

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字面的十六进制表示。

除了@Michael Robinson所说的,在你的例子中,这也是有效的:

${0x0} = 'test';
$var = "0";
echo $$var; // prints "test"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM