4

我依稀记得,从我第一次阅读 PHP 文档(10 多年前)开始,访问数组 ( $string[0]) 中的字符的类数组语法造成了一些歧义或未定义的行为。

O'Reilly PHP 袖珍参考(第 2 版)指出:

为了解决字符串和数组之间的歧义问题,引入了一种新语法来取消引用字符串中的单个字符:

$string{2}

此语法等效于$string[2],并且更可取。

我知道这$string[2]可能会令人困惑,但我不确定它怎么会模棱两可?

此外:考虑到花括号(显然)也适用于“真实”数组,我想知道新语法如何消除歧义/混乱。 $string{2}

4

3 回答 3

6

唯一的歧义是,如果您期望一个数组,但实际上有一个字符串,$var[0]则会给您字符串的第一个字节而不是第一个数组元素。这可能会导致很多人摸不着头脑,想知道为什么 PHP 只给你第一个字符而不是整个数组元素。对于像这样的非数字索引更是如此$var['foo'],如果它是一个字符串,它实际上是有效$var的(是的,请不要问)。即,如果您的程序一开始就出错,它可能会使调试更加困难。

正确的程序没有歧义,因为变量不能同时是字符串和数组。

于 2012-05-06T01:39:57.843 回答
2

由于字符串偏移量和数组偏移量之间的歧义导致的许多问题已随着 5.4 中的更改(在您的参考发布日期之后)被删除。 http://php.net/manual/en/migration54.incompatible.php

出于这个原因,我建议 [] 用于新代码中的字符串偏移量。

于 2012-05-06T01:49:13.590 回答
1

好吧,我已经用这段代码测试了一些变量:

<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"
于 2012-05-06T01:47:45.073 回答