php中的 引用

2021-05-24 02:09:43 字數 2123 閱讀 7213

引用是什麼

在 php 中引用意味著用不同的名字訪問同乙個變數內容。這並不像 c 的指標,替代的是,引用是符號表別名。注意在 php 中,變數名和變數內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 unix 的檔名和檔案本身——變數名是目錄條目,而變數內容則是檔案本身。引用可以被看作是 unix 檔案系統中的 hardlink。

引用做什麼

1. php 的引用允許用兩個變數來指向同乙個內容。意思是,當這樣做時:

這意味著 $a

和 $b

指向了同乙個變數。 $a

和 $b

在這裡是完全相同的,這並不是 $a

指向了 $b

或者相反,而是 $a

和 $b

指向了同乙個地方。 如果具有引用的陣列被拷貝,其值不會解除引用。對於陣列傳值給函式也是如此。

如果對乙個未定義的變數進行引用賦值、引用引數傳遞或引用返回,則會自動建立該變數。

warning如果在乙個函式內部給乙個宣告為 global 的變數賦於乙個引用,該引用只在函式內部可見。可以通過使用 $globals

陣列避免這一點。 把 global $var; 當成是 $var =& $globals['var']; 的簡寫。從而將其它引用賦給 $var 只改變了本地變數的引用。

2. 引用做的第二件事是用引用傳遞變數。這是通過在函式內建立乙個本地變數並且該變數在呼叫範圍內引用了同乙個內容來實現的。例如:

將使 $a

變成 6。這是因為在 foo

函式中變數 $var

指向了和 $a

指向的同乙個內容。

3. 引用做的第三件事是引用返回。引用返回用在當想用函式找到引用應該被繫結在哪乙個變數上面時。不要用返回引用來增加效能,引擎足夠聰明來自己進行優化。僅在有合理的技術原因時才返回引用!要返回引用,使用此語法:

本例中 getvalue

函式所返回的物件的屬性將被賦值,而不是拷貝,就和沒有用引用語法一樣。

和引數傳遞不同,這裡必須在兩個地方都用 & 符號——指出返回的是乙個引用,而不是通常的乙個拷貝,同樣也指出 $myvalue

是作為引用的繫結,而不是通常的賦值。

如果試圖這樣從函式返回引用:return ($this->value);,這將不會起作用,因為在試圖返回乙個表示式的結果而不是乙個引用的變數。只能從函式返回引用變數——沒別的方法。如果**試圖返回乙個動態表示式或 new 運算子的結果,自 php 4.4.0 和 php 5.1.0 起會發出一條e_notice錯誤。

引用不是什麼

引用不是指標。這意味著下面的結構不會產生預期的效果:

這將使 foo

函式中的 $var

變數在函式呼叫時和 $bar

繫結在一起,但接著又被重新繫結到了 $globals["baz"]

上面。不可能通過引用機制將 $bar

在函式呼叫範圍內繫結到別的變數上面,因為在函式 foo

中並沒有變數 $bar

(它被表示為 $var

,但是 $var

只有變數內容而沒有呼叫符號表中的名字到值的繫結)。可以使用引用返回來引用被函式選擇的變數。

引用定位

許多 php 的語法結構是通過引用機制實現的,所以上述有關引用繫結的一切也都適用於這些結構。一些結構,例如引用傳遞和返回,已經在上面提到了。其它使用引用的結構有:

global 引用:當用 global $var 宣告乙個變數時實際上建立了乙個到全域性變數的引用。也就是說和這樣做是相同的: 

這意味著,例如,unset $var

不會 unset 全域性變數。

$this :在乙個物件的方法中,$this

永遠是呼叫它的物件的引用。

取消引用

當 unset 乙個引用,只是斷開了變數名和變數內容之間的繫結。這並不意味著變數內容被銷毀了。例如:

再拿這個和 unix 的unlink呼叫來模擬一下可能有助於理解。

php 中引用的應用

在php 中引用的意思是 不同的名字訪問同乙個變數內容.1 變數之間的引用 a 10 b a 此時 b和 a所指向的是同一儲存位址 如果 a 11 則zend會開闢乙個新的單元從來是的 a 11 b 還是原來的位址 a 10 b a 此時 b 就是 a的別名,比如這個人叫小張,大名叫張三一樣,如果 ...

PHP4 中的引用

引用是個很奇妙的東西,有點類似c中的指標,但是又不一樣!在php中,引用只是變數內容的另外乙個名字。下面我打幾個比方說明一下 只是php4的內容,php5中關於類和物件的用法有很大的變化,還沒有仔細研究過 1 a b 這裡建立了乙個引用 a,他指向變數名為 b的變數所指向的變數內容,羅嗦一點了啊。打...

PHP中命名空間的引用

1 在介紹引用之前要知道命名空間中幾個術語的概念。1 完全限定名稱 任何php 都可以引用完全限定名稱,它是乙個命名空間反斜線開頭的識別符號,如 c root sub1,c root sub1 returnfunctionname 等。2 限定名稱 至少有乙個命名空間分隔符的識別符號,如sub1 r...