標籤:
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));
PHP "陣列變數"之"寫時複製的要點" 只有數組才有的概念。