在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 上述的程式...