在php中的變數和函式名前加 符號的意思

2021-05-23 11:58:10 字數 2887 閱讀 7137

在php中的變數和函式名前加&符號的意思:

在php中&符號即傳的是變數的引用而不是拷貝,引用意味著用不同的名字訪問同乙個變數內容。這並不像 c 的指標,它們是符號表別名。注意在 php 中,變數名和變數內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 unix 的檔名和檔案本身 - 變數名是目錄條目,而變數內容則是檔案本身。引用可以被看作是 unix 檔案系統中的緊密連線。

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

<?php

$a =&$b

?>

這意味著 $a 和 $b 指向了同乙個變數。

注: $a 和 $b 在這裡是完全相同的,這並不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同乙個地方。

同樣的語法可以用在函式中,它返回引用,以及用在 new 運算子中(php 4.0.4 以及以後版本):

<?php

$bar =& new fooclass();

$foo =& find_var ($bar);

?>

注: 不用 & 運算子導致物件生成了乙個拷貝。如果你在類中用 $this,它將作用於該類當前的例項。沒有用 & 的賦值將拷貝這個例項(例如物件)並且 $this 將作用於這個拷貝上,這並不總是想要的結果。由於效能和記憶體消耗的問題,通常你只想工作在乙個例項上面。

儘管你可以用 @ 運算子來關閉建構函式中的任何錯誤資訊,例如用 @new,但用 &new 語句時這不起效果。這是 zend 引擎的乙個限制並且會導致乙個解析錯誤。

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

<?php

function foo (&$var)

$a=5;

foo ($a);

?>

將使 $a 變成 6。這是因為在 foo 函式中變數 $var 指向了和 $a 指向的同乙個內容。更多詳細解釋見引用傳遞。

引用做的第三件事是引用返回。

引用不是什麼

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

<?php

function foo (&$var)

foo($bar);

?>

這將使 foo 函式中的 $var 變數在函式呼叫時和 $bar 繫結在一起,但接著又被重新繫結到了 $globals["baz"] 上面。不可能通過引用機制將 $bar 在函式呼叫範圍內繫結到別的變數上面,因為在函式 foo 中並沒有變數 $bar(它被表示為 $var,但是 $var 只有變數內容而沒有呼叫符號表中的名字到值的繫結)。

引用傳遞

你可以將乙個變數通過引用傳遞給函式,這樣該函式就可以修改其引數的值。語法如下:

<?php

function foo (&$var)

$a=5;

foo ($a);

// $a is 6 here

?>

注意在函式呼叫時沒有引用符號 - 只有函式定義中有。光是函式定義就足夠使引數通過引用來正確傳遞了。

以下內容可以通過引用傳遞:

變數,例如 foo($a)

new 語句,例如 foo(new foobar())

從函式中返回的引用,例如:

<?php

function &bar()

foo(bar());

?>

詳細解釋見引用返回。

任何其它表示式都不能通過引用傳遞,結果未定義。例如下面引用傳遞的例子是無效的:

<?php

function bar()

foo(bar());

foo($a = 5) // 表示式,不是變數

foo(5) // 常量,不是變數

?>

這些條件是 php 4.0.4 以及以後版本有的。

引用返回

引用返回用在當你想用函式找到引用應該被繫結在哪乙個變數上面時。當返回引用時,使用此語法:

<?php

function &find_var ($param)

$foo =& find_var ($bar);

$foo->x = 2;

?>

本例中 find_var 函式所返回的物件的屬性將被設定(譯者:指的是 $foo->x = 2; 語句),而不是拷貝,就和沒有用引用語法一樣。

注: 和引數傳遞不同,這裡必須在兩個地方都用 & 符號 - 來指出返回的是乙個引用,而不是通常的乙個拷貝,同樣也指出 $foo 是作為引用的繫結,而不是通常的賦值。

取消引用

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

<?php

$a = 1;

$b =& $a;

unset ($a);

?>

不會 unset $b,只是 $a。

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

引用定位

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

global 引用

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

<?php

$var =& $globals["var"];

?>

這意味著,例如,unset $var 不會 unset 全域性變數。

$this

在乙個物件的方法中,$this 永遠是呼叫它的物件的引用。

下面是測試的例子

在php中的變數和函式名前加 符號的意思

在php中 符號即傳的是變數的引用而不是拷貝,引用意味著用不同的名字訪問同乙個變數內容。這並不像 c 的指標,它們是符號表別名。注意在 php 中,變數名和變數內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 unix 的檔名和檔案本身 變數名是目錄條目,而變數內容則是檔案本身。引用可...

PHP中引用(變數和函式名前加 符號)的用法

url a 5 b a echo b a echo echo b 相當於動態跟蹤變數 而不是固定他的值 a 5 b a b world echo a world 引用傳遞引數 function inc v v 10 inc v 屬於值傳遞,只是傳入外部變數的副本,函式內部的修改和外部變數沒有關係,值...

PHP中在函式和變數前加 的作用例解

操作符在php中通常有兩種意思 就是 與 的操作符,這次我們主要說只有乙個 在函式前加 表示 引用函式返回的那個物件 引用符 位址引用 因為它引用了函式web318 fun 返回的值,即相當於 ww web318 fun function web318 fun ww web318 fun echo ...