众所周知,PHP 5.4 alpha 已经发布。我对以下内容有疑问。
简化的字符串偏移读取。
$str[1][0]
现在是一个合法的结构。
具体是如何$str[1][0]
工作的?
编辑: http: //php.net/releases/NEWS_5_4_0_alpha1.txt
众所周知,PHP 5.4 alpha 已经发布。我对以下内容有疑问。
简化的字符串偏移读取。
$str[1][0]
现在是一个合法的结构。
具体是如何$str[1][0]
工作的?
编辑: http: //php.net/releases/NEWS_5_4_0_alpha1.txt
它只是意味着当读取字符串偏移量时,PHP 再次返回一个字符串,您可以再次在该字符串上访问偏移量。(在那个访问上还有另一个偏移量。它变得有趣了$str[0][0][0][0][0][0]
)
在 PHP 5.4 之前,您会收到“不能将字符串偏移量用作数组”错误。
这是一个副作用,并在此处的提案中提到: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"。
如果没有人反对,我将提交补丁。
谢谢。德米特里。
当您将代码从 php 5.3 升级到 5.4 时,这实际上会产生一些有趣的错误。
在 5.3 中,此构造将返回 false:
$array = array("This is a string");
echo isset($array[0][0][0]);
在 5.4 中,这将返回 true。