字符串 - PHP 中的数组歧义
Posted
技术标签:
【中文标题】字符串 - PHP 中的数组歧义【英文标题】:string - array ambiguity in PHP 【发布时间】:2012-05-15 02:16:44 【问题描述】:我依稀记得,从我第一次阅读 php 文档(10 多年前)开始,访问数组中字符的类似数组的语法 ($string[0]
) 存在一些歧义或未定义的行为。
O'Reilly PHP 袖珍参考(第 2 版)指出:
为了解决字符串和数组之间的歧义问题,一个 引入了新语法来取消引用单个字符 来自字符串:
$string2
此语法等效于
$string[2]
,并且更可取。
我知道$string[2]
可能会令人困惑,但我不确定它怎么会模棱两可?
此外:考虑到花括号 (apparently) 也适用于“真实”数组,我想知道 the new syntax $string2
如何消除歧义/混淆。
【问题讨论】:
我不确定我是否理解正确,但我在这里没有看到问题,因为从这个角度来看,$string2(或 $string[2])用于作为一个字符串,选择第二个字符或从数组的角度,检索第二个元素,这对于解释器来说基本上是一样的,因为字符串对于解释器来说也只是一个数组。 最新的php版本变得很奇怪$str = 'hi'; echo $str[0][0][0][0][0][0][0];//outputs h
,只是递归地为第一个字符做substr
【参考方案1】:
唯一的歧义是,如果您期望一个数组,但实际上有一个字符串,$var[0]
将给您字符串的第一个字节而不是第一个数组元素。这可能会导致很多人摸不着头脑,想知道为什么 PHP 只给你第一个字符而不是整个数组元素。对于像$var['foo']
这样的非数字索引更是如此,如果$var
是一个字符串,它实际上是有效的(是的,请不要问)。 IE。如果您的程序一开始就出错,可能会使调试更加困难。
正确的程序没有歧义,因为变量不能同时是字符串和数组。
【讨论】:
+1 和咆哮:这是一个典型的 PHP“解决方案”,它......什么也解决不了。错误地将[]
放在字符串上会得到意外结果,而将
错误地放在数组上也会得到意外结果,因为您总是只期待一个字符。当然这不是真的,因为正如 OP 所说,
在数组上也“正常”工作,所以现在
与[]
有同样的问题,导致
被引入。也许未来的尝试会在我们用完标点符号之前设法做到这一点。呃。
$var['foo']
有效,因为 PHP 知道它不是一个数组,'foo' 不是这个非数组的有效键,所以它被强制为 0 并变为 $var[0]
@Marc 是的,有一个解释,但这并没有真正让它变得更好。 :) 5.4 中至少触发通知的行为更有意义。【参考方案2】:
由于字符串偏移量和数组偏移量之间的歧义导致的许多问题已随着 5.4 中的更改(在您的参考发布日期之后)被删除。 http://php.net/manual/en/migration54.incompatible.php
因此,我建议在新代码中使用 [] 作为字符串偏移量。
【讨论】:
【参考方案3】:好吧,我已经用这段代码测试了一些变量:
<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($var0);
?>
这两者之间似乎没有任何区别。
输出是:
string(3) "php"
string(3) "php"
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
string(1) "p"
string(1) "p"
【讨论】:
array(TRUE)
的输出是 bool(TRUE);bool(TRUE);
BTW,如果有人想知道的话:)以上是关于字符串 - PHP 中的数组歧义的主要内容,如果未能解决你的问题,请参考以下文章