首頁  >  文章  >  後端開發  >  php數組是不是引用型

php數組是不是引用型

青灯夜游
青灯夜游原創
2022-09-20 19:08:592019瀏覽

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影片教學

以上是php數組是不是引用型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn