PHP "数组变量"之"写时复制的要点" 只有数组才有的概念。

1.如果数组指针位置非法,复制时,会将新数组指针初始化!

2.值传递时,PHP采用了一个COW(写时复制,copy on write)的优化措施!

写时复制的两个要点:  (实际开发可以使用reset unset 解决这类问题)

<?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));

你可能感兴趣的:(PHP "数组变量"之"写时复制的要点" 只有数组才有的概念。)