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 的简化字符串偏移读取的主要内容,如果未能解决你的问题,请参考以下文章

php 5.4 异常字符集

如何在 PHP 中修复警告非法字符串偏移

未初始化的字符串偏移php

PHP 警告:jwt 的非法字符串偏移

Drupal 8 警告:非法字符串偏移 'name' DrupalBootstrapStyles.php

DLL注入替换已知偏移量C ++的字符串