入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Foreach 函数在PHP 7 中的变化

创建时间:2017-06-07 投稿人: 浏览次数:1411

PHP 7发布至今已有两年多的时间(7.0.0alpha1),相信大部分PHP开发者已经或者正在使用PHP7作为主要开发版本。不过,建议开发者在选择PHP7版本前,仔细认真浏览一下升级日志。作者在实际项目中就遇到了一个foreach函数在PHP 5 与PHP 7不同版本下难以发现之坑。

PHP 7 UPGRADING

PHP 7升级备注

在PHP 5 中执行下面代码:

123456789
$stack = "";$collections = [1,2,3,4,5,6,7];foreach($collections as $key => $collection) {  $stack[$key] = $collection . "_" . $key;}var_dump($stack);

执行完成后,正常打印结果:

123456789101112131415161718
>>> var_dump($stack);array(7) {  [0]=>  string(3) "1_0"  [1]=>  string(3) "2_1"  [2]=>  string(3) "3_2"  [3]=>  string(3) "4_3"  [4]=>  string(3) "5_4"  [5]=>  string(3) "6_5"  [6]=>  string(3) "7_6"}

接着,我们将相同代码放在PHP 7 中运行,结果显示如下:

12
>>> var_dump($stack);string(7) "1234567"

非常奇怪,为什么打印结果会是一个字符串?

我们继续修改一下源码:

123456789
$stack = [];$collections = [1,2,3,4,5,6,7];foreach($collections as $key=> $collection) {  $stack[$key] = $collection . "_" . $key;}var_dump($stack);

然后在PHP7与PHP5中分别执行,最后都是得到如下结果:

1234567891011121314151617
>>> var_dump($stack);array(7) {  [0]=>  string(3) "1_0"  [1]=>  string(3) "2_1"  [2]=>  string(3) "3_2"  [3]=>  string(3) "4_3"  [4]=>  string(3) "5_4"  [5]=>  string(3) "6_5"  [6]=>  string(3) "7_6"}

继续在PHP5 与 PHP 7中执行如下代码:

123456789101112
$stack = "";$collections = [1,2,3,4,5,6,7];foreach($collections as $key => $collection) {  var_dump($collection . "_" . $key);  var_dump($stack);  $stack[$key] = $collection . "_" . $key;  var_dump($stack);  exit();}

PHP 7 中打印结果:

123
string(3) "1_0"string(0) ""string(1) "1"

而PHP 5中打印结果:

123456
string(3) "1_0"string(0) ""array(1) {  [0]=>  string(3) "1_0"}

如果将变量$stack = [];赋值未数组,在PHP 5 与PHP 7中都是得到如上结果。

foreach函数在PHP 7中的变化

  • foreach() 迭代不再影响数组内部指针,数组指针可通过 current()/next() 等系列的函数访问。例如:

    1234567
    
    >>> $array = [0, 1, 2];>>> foreach ($array as &$val) {...     var_dump(current($array));... }int(0)int(0)int(0)
    

    现在将指向值 int(0) 三次。以前的输出是 int(1)、int(2) 和 bool(false)。

  • 在对数组按值迭代时,foreach 总是在对数组副本进行操作,在迭代中任何对数组的操作都不会影响到迭代行为。例如:

    12345678910
    
    $array = [0, 1, 2];$ref =& $array; // Necessary to trigger the old behaviorforeach ($array as $val) {  var_dump($val);  unset($array[1]);}int(0)int(1)int(2)
    

    现在将打印出全部三个元素 (0 1 2),而以前第二个元素 1 会跳过 (0 2)。

  • 在对数组按引用迭代时,对数组的修改将继续会影响到迭代。不过,现在 PHP 在使用数字作为键时可以更好的维护数组内的位置。例如,在按引用迭代过程中添加数组元素:

    12345678
    
    $array = [0];foreach ($array as &$val) {    var_dump($val);    $array[1] = 1;}int(0)int(1)
    

    现在迭代会正确的添加了元素。如上代码输出是 “int(0) int(1)”,而以前只是 “int(0)”。

来源:https://chenghuiyong.com/

参考

  • https://linux.cn/article-5840-1.html#4_4658
  • PHP’foreach’实际上如何工作?
  • https://wiki.php.net/rfc/php7_foreach
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。