程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 探討PHP引用&符號的一些注意問題

探討PHP引用&符號的一些注意問題

編輯:關於PHP編程

很多人誤解php中的引用跟C當中的指針一樣,事實上並非如此,而且很大差別。C語言中的指針除了在數組傳遞過程中不用顯式申明外,其他都需要使用*進行定義,而php中對於地址的指向(類似指針)功能不是由用戶自己來實現的,是由Zend核心實現的,PHP引用&符號采用的是“寫時拷貝”的原理,就是除非發生寫操作,指向同一個地址的變量或者對象是不會被拷貝的,比如下面的代碼:

  1. $a = array('a','c'...'n');  
  2. $b = $a; 

如果程序僅執行到這裡,$b和$b是相同的,但是並沒有像C那樣,$a和$b占用不同的內存空間,而是指向了同一塊內存,這就是php和c的差別,並不需要寫成$b=&$a才表示$b指向$a的內存,zend就已經幫你實現了引用,並且zend會非常智能的幫你去判斷什麼時候該這樣處理,什麼時候不該這樣處理。

如果在後面繼續寫如下代碼,增加一個函數,通過PHP引用&符號的方式傳遞參數,並打印輸出數組大小。

  1. function printArray(&$arr) //引用傳遞  
  2.     {  
  3.         print(count($arr));  
  4.     }  
  5.  
  6.      printArray($a); 

上面的代碼中,我們通過PHP引用&符號把$a數組傳入printArray()函數,zend引擎會認為printArray()可能會導致對$a的改變,此時就會自動為$b生產一個$a的數據拷貝,重新申請一塊內存進行存儲。這就是前面提到的“寫時拷貝”概念。

如果我們把上面的代碼改成下面這樣:

  1. function printArray($arr)  //值傳遞  
  2.     {  
  3.         print(count($arr));  
  4.     }  
  5.  
  6.      printArray($a); 


上面的代碼直接傳遞$a值到printArray()中,此時並不存在引用傳遞,所以沒有出現寫時拷貝。

大家可以測試一下上面兩行代碼的執行效率,比如外面加入一個循環1000次,看看運行的耗時,結果會讓你知道不正確使用PHP引用&符號會導致性能下降30%以上。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved