php數組不是引用類型,而是值類型;數組賦值時會建立不同的變數(副本),因此修改另一個變量,不會影響到數組本身。且PHP數組傳遞是值傳遞;在呼叫函數時透過將PHP數組作為實參賦給形參,在函數中修改,不會影響到數組本身,說明此過程中的傳遞是值傳遞,數組變數並非指向此數組本身的引用。
本教學操作環境:windows7系統、PHP8.1版、DELL G3電腦
在PHP中,大部分變量類型,如字串,整數,浮點,數組等都是值類型的,而類別和物件是引用類型,在使用的時候,需要注意這一點。
PHP的變數在記憶體中是這樣儲存的,變數保存的不是直接是值的內容,而是位址。例如:
$a = 1;
我們看起來,似乎變數$a直接儲存了 1 這個值。而實際情況是,PHP解譯器建立了變數$a,將值:1 存入記憶體中的某個地方,再將值的位址存到變數$a。
需要取值時,先找到變數$a中的位址,再根據位址找到變數的值。
往下看:
echo $a;
會輸出1,PHP解釋器會這樣完成這一樣程式碼:找到$a中儲存的位址,根據位址找到存在記憶體某個地方的值,輸出到螢幕。
看似一行簡單的程式碼,流程卻是這樣的。
再往下看:
$a = 1; $b = &$a;
這裡的變數$b 做了一個有趣的操作,&符號取出了$a變數中儲存的位址,並儲存到$b變數。
那麼,如果使用下面程式碼:
echo $b;
結果也會是輸出1,PHP解釋器先取出$b中儲存的位址,再根據位址找到值。如果我們做下面的操作:
$a = 2; echo $b; //输出2
會發現改變$a的值,$b也跟著改變了。其實反過來,改變$b的值,$a的值也會跟著改變。
到這一步,我們可以確定,變數$a和$b儲存了相同的位址,指向的值是一樣的。
那麼,我們可以得出結論:它們表示的是同一個變數。
進一步總結,可以得到:如果兩個變數儲存了相同的位址,它們就是同一個變數。
了解了一些內容,我們開始介紹值型別和引用型別。
我們先看下面的程式碼:
$a = 1; $b = $a; $a = 2; echo $b; //输出 1
將$a的值賦給$b,改變$a的值後,$b的值依然不變,也就是說$a和$b是兩個不同的變量,指向不同的位址。這種賦值時會創建不同的變數的形式我們稱之為值類型。
再看:
class User{ public $name = ‘Tome‘; } $a = new User; $b = $a; $a->name = ‘Jim‘; echo $b->name; //输出 Jim
同樣將$a的值賦給$b,改變$a後,$b也跟著變了,也就是說$a和$b是同一個變量,指向相同的位址。這種賦值時不會創建新的變數的形式我們稱之為引用型別。
php陣列 值類型
#PHP中陣列傳遞是值傳遞而非引用傳遞。
在呼叫函數時透過將PHP陣列當作實參賦給形參,在函數中修改,不會影響到陣列本身。
說明此過程中的傳遞為值傳遞,數組變數並非是指向此數組本身的引用,PHP數組本身以值的形式存在,同時形參是對數組的拷貝。
這一點與其他一些語言不同(如c、Js等)很不相同,值得注意!
範例如下:
$arr = array( 'name' => 'corn', 'age' => '24', ); test_arr($arr); function test_arr($arr){ $arr['name'] = 'qqyumidi'; } print_r($arr); //result: Array ( [name] => corn [age] => 24 )
js程式碼如下:
var arr = new Array('corn', '24'); test_arr(arr); function test_arr(arr){ arr[0] = 'qqyumidi'; } console.log(arr); //result:["qqyumidi", "24"]
如果需要對PHP中的值傳遞使用參考傳遞效果,可以在形參前面加上取地址符&。
$aa = 100; test_vars($aa); function test_vars(&$aa){ $aa = 200; } print_r($aa); //result: 200
推薦學習:《PHP影片教學》
以上是php數組是不是引用型的詳細內容。更多資訊請關注PHP中文網其他相關文章!