PHP "陣列變數"之"寫時複製的要點" 只有數組才有的概念。

來源:互聯網
上載者:User

標籤:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.