10

众所周知,PHP 5.4 alpha 已经发布。我对以下内容有疑问。

简化的字符串偏移读取。 $str[1][0]现在是一个合法的结构。

具体是如何$str[1][0]工作的?

编辑: http: //php.net/releases/NEWS_5_4_0_alpha1.txt

4

3 回答 3

11

它只是意味着当读取字符串偏移量时,PHP 再次返回一个字符串,您可以再次在该字符串上访问偏移量。(在那个访问上还有另一个偏移量。它变得有趣了$str[0][0][0][0][0][0]

在 PHP 5.4 之前,您会收到“不能将字符串偏移量用作数组”错误。

于 2011-07-05T19:58:54.523 回答
7

这是一个副作用,并在此处的提案中提到:http: //php.markmail.org/thread/yiujwve6zdw37tpv

该功能是字符串偏移的速度/优化。

你好,

最近我注意到字符串偏移量的读取分两步执行。首先在 zend_fetch_dimension_address_read() 中创建临时变量的特殊 string_offset 变体,然后在 _get_zval_ptr_var_string_offset() 中创建真正的字符串值。

我认为我们可以首先创建真正的字符串。这使得字符串偏移读取操作的速度提高了 50%,并允许消除 VM 中的一些检查和条件性早午餐。

附上补丁(不要忘记重新生成 zend_vm_execute.h 来测试它)。但是,它会在一种虚假情况下改变行为。下面的代码现在将发出“b”(目前它会产生一个致命错误 - 不能将字符串偏移量用作数组)。

$str = "abs";
var_dump($str[1][0]);

我认为这根本不是问题。"b" 是有意义的,因为 "abs"[1] -> "b" 和 "b"[0] -> "b"。

如果没有人反对,我将提交补丁。

谢谢。德米特里。

于 2011-07-05T21:00:37.057 回答
1

当您将代码从 php 5.3 升级到 5.4 时,这实际上会产生一些有趣的错误。

在 5.3 中,此构造将返回 false:

$array = array("This is a string");

echo isset($array[0][0][0]);

在 5.4 中,这将返回 true。

于 2013-02-12T10:07:32.280 回答