我隐约记得,从我第一次阅读PHP文档(10多年前)开始,访问数组中字符的类似数组的语法($string[0]
)带来了一些歧义或未定义的行为。
O'Reilly PHP Pocket Reference (2nd ed) 指出:
要解决字符串和数组之间的歧义问题,一个 引入了新语法以取消引用单个字符 从字符串:
$string{2}
此语法等效于
$string[2]
,并且更可取。
我知道$string[2]
可能会令人困惑,但我不确定它怎么会模棱两可?
此外:我想知道新语法$string{2}
如何消除歧义/混淆,考虑到大括号(显然)也适用于"真实"数组。
唯一的歧义是,如果你期待一个数组,但实际上有一个字符串,$var[0]
会给你字符串的第一个字节,而不是第一个数组元素。这可能会导致很多人挠头,并想知道为什么 PHP 只给你第一个字符而不是整个数组元素。对于像 $var['foo']
这样的非数字索引来说更是如此,如果$var
是一个字符串,它实际上有效(是的,请不要问)。也就是说,如果您的程序首先是错误的,它可能会使调试稍微困难一些。
正确的程序没有歧义,因为变量不能同时是字符串和数组。
由字符串偏移量和数组偏移量之间的歧义引起的许多问题已随着 5.4 中的更改而删除,即在您的参考发布日期之后。 http://php.net/manual/en/migration54.incompatible.php
出于这个原因,我建议在新代码中使用 [] 作为字符串偏移量。
好吧,我已经用这段代码测试了一些变量:
<pre><?php
dumpling(array("php"));
dumpling(array());
dumpling(0);
dumpling(1);
dumpling(TRUE);
dumpling(FALSE);
dumpling(NULL);
dumpling("php");
function dumpling($var){
var_dump($var[0]);
var_dump($var{0});
}
?>
这两者之间似乎没有任何区别。
输出为:
string(3) "php"
string(3) "php"
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
string(1) "p"
string(1) "p"