PHP 5.4 的简化字符串偏移读取
Posted
技术标签:
【中文标题】PHP 5.4 的简化字符串偏移读取【英文标题】:PHP 5.4's simplified string offset reading 【发布时间】:2011-09-29 02:28:09 【问题描述】:众所周知,php 5.4 alpha 已经发布。我对以下内容有疑问。
简化的字符串偏移读取。
$str[1][0]
现在是合法的构造。
$str[1][0]
究竟是如何工作的?
编辑: http://php.net/releases/NEWS_5_4_0_alpha1.txt
【问题讨论】:
任何链接到您引用的来源? 示例:codepad.viper-7.com/a1VeFo @Gordon:啊...有道理,我猜是因为:添加了数组解引用支持。但我想知道$str[1][0]
的优势是什么。与$str[1]
相同。所以没有什么特别的。 $str[1]
返回一个包含一个字符的字符串,[0]
正在访问位置 0
处的字符。
@Felix 这也是我想知道的。我无法理解它。提交信息也不是很清楚:marc.info/?l=php-cvs&m=127928075722194 - 这样做的实际目的是什么?
@Gordon... 我认为实用性只是一个简化的实现。作为副作用,您现在可以根据需要多次添加[0]
。这实际上是有道理的(即使它没有实际用途),因为偏移量应该返回一个字符串。 (PHP 没有 char
类型。)编辑:@nikic 所说的。
【参考方案1】:
这只是意味着当读取一个字符串偏移量时,PHP 再次返回一个字符串,您可以再次访问一个偏移量。 (在那个访问上还有另一个偏移量。$str[0][0][0][0][0][0]
很有趣)
在 PHP 5.4 之前,您会收到“不能将字符串偏移量用作数组”错误。
【讨论】:
是的。但是,如果您在 PHP 5.3 中执行var_dump($str[1])
,它也表示该值是一个字符串。所以这似乎是内部的东西……很奇怪。至少这似乎与我最初认为的数组取消引用无关,因为否则你会在 PHP 5.3 中使用 $str[0][0]
得到语法错误。
@Felix:数组解引用是不同的。这是获取函数返回值的数组偏移量的能力;)即func()[0]
.
我现在知道了......但我认为它可能是相关的(但知道我考虑了一下,$str[0][0]
更像是访问一个多维数组,这在以前已经工作过...... . 我想我应该休息一下;))
这现在也有效:$str = "ABC"; $str[0] = "XYZ";
结果:$str == "XBC"
。
@nikic,即使没有触发错误,它也可能不会真正改变原来的$str
。这更像是在说“更改$str[0]
返回的新字符串的第一个索引”。也就是说,从技术上讲,您将更改临时字符串的值。【参考方案2】:
这是一个副作用,并在此处的提案中提到: http://php.markmail.org/thread/yiujwve6zdw37tpv
特点是字符串偏移的速度/优化。
嗨,
最近我注意到阅读 字符串偏移分两次执行 脚步。起初特殊的 string_offset 临时变量的变体是 创建于 zend_fetch_dimension_address_read() 然后真正的字符串值是 创建于 _get_zval_ptr_var_string_offset().
我认为我们可以创建真正的字符串 首先。这使得 50% 加快字符串偏移读取 操作,并允许消除一些 VM 中的检查和条件式早午餐。
补丁已附上(不要忘记 重新生成 zend_vm_execute.h 进行测试 它)。然而,它改变了行为 一个假案子。现在下面的代码 将发出“b”(当前它生成 致命错误 - 无法使用字符串 作为数组的偏移量)。
$str = "abs"; var_dump($str[1][0]);
我认为这根本不是问题。 “乙” 有意义,因为 "abs"[1] -> "b" 和“b”[0] -> “b”。
我将提交补丁以防万一 无异议。
谢谢。德米特里。
【讨论】:
【参考方案3】:当您将代码从 php 5.3 升级到 5.4 时,这实际上会产生一些有趣的错误。
在 5.3 中,此构造将返回 false:
$array = array("This is a string");
echo isset($array[0][0][0]);
在 5.4 中,这将返回 true。
【讨论】:
有趣。请注意,是isset()
允许它在早期的 PHP 版本上运行,而不是数组 (demo with var_dump( isset($foo[0][0]) );
)。 Adding one more [0]
在 PHP 5.0 到 5.3 上是致命的。以上是关于PHP 5.4 的简化字符串偏移读取的主要内容,如果未能解决你的问题,请参考以下文章