代码拉取完成,页面将自动刷新
- foreach 中错误使用引用
<?php
$array1 = ["k1"=>1,"k2"=>2,"k3"=>3];
/*代码片段1*/
foreach($array1 as $k1=> &$v1)
{
$v1 = $v1+1;
}
xdebug_debug_zval('array1');
//array1: (refcount=1, is_ref=1)=array ('k1' => (refcount=1, is_ref=1)=2, 'k2' => (refcount=1, is_ref=1)=3, 'k3' => (refcount=2, is_ref=1)=4)
//其中 refcount 表示引用计数,is_ref 表示是否为引用,0 表示不是引用,1 表示是引用
xdebug_debug_zval("v1");
//v1: (refcount=2, is_ref=1)=4
/*代码片段2*/
//其实上面的 foreach 内部相当于下面的代码片段,但是实际情况会复杂很多,这里只是类比
$array2 = ["k1"=>1,"k2"=>2,"k3"=>3];
$v2 = &$array2['k1'];//声明$v2变量是$array2['k1']的reference(译作:引用)
$v2 = $v2+1;
$v2 = &$array2['k2'];
$v2 = $v2+1;
$v2 = &$array2['k3'];
$v2 = $v2+1;
xdebug_debug_zval('array2');
//array2: (refcount=1, is_ref=0)=array ('k1' => (refcount=1, is_ref=1)=2, 'k2' => (refcount=1, is_ref=1)=3, 'k3' => (refcount=2, is_ref=1)=4)
xdebug_debug_zval("v2");
//v2: (refcount=2, is_ref=1)=4
//接下来我们应该把 $v2 变量 unset 掉,避免对 $array2['k3'] 的值产生副作用
//这时发现 $v2 成了未初始化的变量
unset($v2);
xdebug_debug_zval('v2');
//v2: (refcount=0, is_ref=0)=*uninitialized*
//我们再次给 $v2 赋值发现它已经非引用变量
$v2 = 111;
xdebug_debug_zval('v2');
//v2: (refcount=0, is_ref=0)=111
- 数组内部指针被玩坏
<?php
/*
php5 系列版本中,
foreach 使用了内部数组指针去遍历数组,
因此如果你在 foreach 内部使用了能够改变 foreach 内部数组指针的方法,例如:
reset($array):重置数组指针到初始位置0
next($array):数组指针移动到下一个
prev($array):数组指针移动到上一个
end($array):数组指针移动到最后一个,
这时我们的遍历数据可能会被打乱,
但在 PHP7 中由于 foreach 内部未使用内部数组指针,因此不会产生影响。
PHP5 和 PHP7 中,每次使用 foreach 遍历数组时都相当于调用了一次 reset 指针操作,让数组指针回到初始位置。
*/
/*代码片段3*/
$array = [1,2,3,4];
foreach ($array as $v)
{
var_dump( $v);//php7依次输出:1,2,3,4 php5依次输出:1,2,3,4
var_dump( next($array));//php7依次输出:2,3,4,false php5依次输出:3,4,false,false
}
先看 stackOverflow 上的对比结果:Performance of FOR vs FOREACH in PHP, 主要有下面几点原因:
$i
计数器,且每次都要判断一下 $i
是否越界此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。