深入理解PHP變數的值型別和引用型別

2022-10-06 05:51:10 字數 1287 閱讀 4584

在php中,大部分變數型別,如字串,整型,浮點,陣列等都是值型別的,而類和物件是引用型別,程式設計客棧在使用的時候,需要注意這一點。

看到網友在討論php的&符號,要徹底理解它的用法,就有必要討論一下變數的兩種形式。

php的變數在記憶體中是這樣儲存的,變數儲存的並不mpuvrrl直接是值的內容,而是位址。例如:

$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 us程式設計客棧er

$a = new user;

$b = $a;

$a->name = 『jim『;

echo $b->name; //輸出 jim

同樣將$a的值賦給$b,改變$a後,$b也跟著變了,也就是說$a和$b是同乙個變數,指向相同的位址。這種賦值時不會建立新的變數的形式我們稱之為引用型別。

本文標題: 深入理解php變數的值型別和引用型別

本文位址:

深入理解PHP原理之變數賦值

在前面的文章 深入理解php原理之變數結構 中我已經介紹了php變數的內部結構,下面我將會對變數賦值過程中,php內部對資料處理的原理進行闡述,不過在講述該原理前,需要先了解一下變數名和它的值是如何關聯起來的,這個對變數賦值內部原理的理解非常重要,例如 a 1 這個例子看起來非常簡單,但是你知道 變...

深入理解PHP原理之變數宣告

在php中沒有對常規變數的宣告操作,如果要使用乙個變數,直接進行賦值操作即可,因為php在賦值操作的同時已經進行宣告操作,那麼php是怎樣在賦值前進行宣告的呢?在博文 深入理解php原理之變數賦值 中其實已經提到過變數的宣告,但是講述的不夠透徹,下面主要通過詞法分析 語法分析和獲取左值和右值的過程,...

深入理解PHP原理之靜態變數

通常意義上靜態變數是靜態分配的,他們的生命週期和程式的生命週期一樣,只有在程式退出時才結束期生命週期,這和區域性變數相反。靜態變數的型別可以分為靜態全域性變數 靜態區域性變 靜態成員變數,最常見的是靜態區域性變數及靜態成員變數,先看看如下區域性變數的使用 function t t t t 上述的程式...