1.如果数组指针位置非法,复制时,会将新数组指针初始化!
2.值传递时,PHP采用了一个COW(写时复制,copy on write)的优化措施!
写时复制的两个要点:
<?php
$arr1 = array(‘吕布‘,‘赵云‘,‘典韦‘);
end($arr1);
next($arr1); //非法了
$arr2 = $arr1; //复制数组
////var_dump($arr2);
echo ‘<br>‘;
var_dump(current($arr2));//初始化$arr2 // PHP要点:
echo ‘<br>‘;
var_dump(current($arr1));//非法false // 1.值传递时,并没有马上为新变量$arr2开辟值空间,而在两个变量都未发生改变之前,还是使用的同一个值空间,
//echo ‘<br>‘; // 注意:current也会发生写操作,导致空间被复制!先current谁,谁是那个新的,数组指针随之初始化
//如果上面两个输出顺序换一下:
//var_dump(current($arr1));//初始化$arr1 // 2.一旦某个变量发生改变,此时会复制值空间,让发生改变的变量去引用新的空间!
//echo ‘<br>‘;
//var_dump(current($arr2));//非法false // 第一句输出决定谁发生改变,所以草绿色代码段输出的是$arr2,此时引用新空间的就是$arr2。否则就是$arr1。
echo ‘<br>‘;
var_dump(current($arr1)); // 例如:$arr2[]=‘关羽‘;输出前决定了$arr2发生改变。所以$arr2引用新空间,复制时,会将新数组指针初始化。
echo ‘<br>‘; // 那么此时非法的就是$arr1。如果$arr1[]=‘关羽‘,输出$arr1就是数组初始化的值:第一个元素‘吕布‘。$arr2非法false
var_dump(current($arr2)); // 简单地说,谁先变,谁就引用新的值空间。 可控的!
foreach 于指针的问题 (不可控的)
1.遍历的是拷贝而不是原数组!
2.只有在原数组发生写操作时,才会真正的拷贝。此时原数组指针停留在当前位置,
如果已经非法,则会初始化!
$arr1 = array(‘一‘,‘二‘,‘三‘);
foreach($arr1 as $key =>$value){
var_dump($key,$value);
if($key == 0){
$arr1[] = ‘hero‘;
}
echo ‘<br>‘;
}
var_dump(crrent($arr1));