php陣列不是參照型別,而是值型別;陣列賦值時會建立不同的變數(副本),因此修改另一個變數,並不會影響到陣列本身。且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陣列是不是參照型別的詳細內容,更多請關注TW511.COM其它相關文章!