字符串 - PHP 中的数组歧义


string - array ambiguity in PHP

我隐约记得,从我第一次阅读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"