簡評PHP引用語法的設計

糾結了一天總算打通了任督二脈,哦不,打通了PHP引用的邏輯了。若是你已經很熟悉PHP了,請暫時忘掉opcode,_zval,copy on write,zend,hiphop等編譯器概念,這裏只是說的語法邏輯而非實現。java

首先我來分析下PHP的變量是怎樣一個語法邏輯模型python

變量名—>中間節點—>內存數據

而這有區別於如js/java/python等語言的變量語法邏輯模型性能優化

變量名—>內存數據

沒錯,就多了一層中間節點,這就是我一直以爲不習慣的地方。那麼爲了驗證以上構建的PHP變量的語法邏輯結構是否合理,我舉一些例子說明函數

  • 兩邊都是普通變量($a指向新的中間節點,新的中間節點指向新的內存數據,這個新內存數據和$b原來的內存數據的是相同的)性能

    $a = $b;
  • 引用賦值(變量$a直接指向變量$b的中間節點)優化

    $a = &$b;
  • 內存賦值(變量$a依然指向它的中間節點不變,可是它的中間節點從新指向了新的內存數據【$b+5】)設計

    $a = $b + 5;
  • 函數傳值code

    function foo(&$var)  //$var在剛傳進來的時候,指向了$bar的中間節點
      {
          $var = 5; //$var所指向的中間節點依然是$bar的那個,可是這個中間節點指向了內存數據5
      }
      foo($bar);  //因此$bar的值也變成了5
  • 函數內的引用賦值更能說明以上創建的模型是適用的ip

    function foo(&$var)  //$var在剛傳進來的時候,指向了$bar的中間節點
      {
          $k = 1;
          $var =&$k; //注意:這裏$var從新指向了$k的中間節點,而未在任何方面影響到$bar
      }
      foo($bar);  //因此$bar一切都沒變

-------------------------------------------------我是分割線-------------------------------------------內存

通過以上舉例,我以爲已經可以證實上文總結出來的PHP變量三級模型是準確無誤的了,關於那個「中間節點」的學名,若是有大大知道的話,煩請在評論中告訴我。

那麼點評下吧

  1. PHP這種變量模型和java/js/python等都有區別,因此初學的時候若是沒搞清楚會像我前幾天同樣被驚訝到
  2. PHP的這種變量模型避免了java/js/python等語言的兩層結構而帶出的deep copy的概念,只要是普通賦值後就是兩個不一樣的數據了(至於copy on write的性能優化不是邏輯上的,初學只須要了解便可)
  3. 這種模型能簡化一些庫函數的設計,由於在java/js/python中,若是傳遞給庫的是一個用戶組出來的List或者Array,那在庫中爲了又能用它又能修改它,須要進行一次deep copy,否則會污染用戶的數據
相關文章
相關標籤/搜索