php陣列是不是參照型別

2022-09-20 22:00:33

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其它相關文章!