首頁 >後端開發 >php教程 >php在函數和變數前面加上 @和$符號的差異詳解

php在函數和變數前面加上 @和$符號的差異詳解

伊谢尔伦
伊谢尔伦原創
2017-06-21 11:01:577454瀏覽

@ 運算子只對表達式有效。對新手來說一個簡單的規則就是:如果能從某處得到值,就能在它前面加上 @ 運算子。例如,可以把它放在變量,函數和 include() 調用,常數,等等之前。不能把它放在函數或類別的定義之前,也不能用於條件結構例如 if 和 foreach 等。
目前的「@」錯誤控制運算子前綴甚至使導致腳本終止的嚴重錯誤的錯誤報告也失效。這意味著如果在某個不存在或類型錯誤的函數呼叫前用了“@”來抑制錯誤訊息,那麼腳本會沒有任何跡象顯示原因而死在那裡。

對於$ 則是我們的重點問題

#基本形式:

function &find_var($param) //这里用&在对象前面,作用为声明
{
    /* ...code... */
    return $found_var;
}
$foo =& find_var($bar); //这里用&,作用为联系变量
$foo->x = 2; //赋值给函数

範例:

function &test()   
{   
static $b=0;//申明一个静态变量   
$b=$b+1;   
echo $b;   
return $b;   
}   
$a=test();//这条语句会输出$b的值为1,
$a=5;   
$a=test();//这条语句会输出$b的值为2 ,因为没有引用返回,$a=5,不对对象起赋值作用
$a=&test();//这条语句会输出$b的值为3 ,成功引用返回,下面的代码起作用
$a=5;   
$a=test();//这条语句会输出$b的值为6

下面解釋下: 
透過這種方式$a=test();得到的其實不是函數的參考返回,這跟普通的函數呼叫沒有差別。至於原因:這是PHP的規定,
php規定透過$a=&test(); 方式得到的才是函數的引用回傳。
至於什麼是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時。) 
用上面的例子來解釋就是:
$a=test()方式呼叫函數,只是將函數的值賦給$a而已,而$a做任何改變都不會影響到函數中的$b,透過$a=&test()方式呼叫函數呢, 他的功能是將return $b中的$b變數的記憶體位址與$a變數的記憶體位址,向了同一個地方,產生了相當於這樣的效果($a=&b;) 所以改變$a的值,也同時改變了$b的值,所以在執行了:$a=&test();
$a=5;
以後,$b的值變成了5 ......

那麼,php函數前面加上&符號又有什麼作用呢?  

php變數前面加上&符號是什麼意思
先看一個範例:

$foo = 321;
$bar = &$foo; 
$bar = 123;
print $foo;
//那么输出的结果将会是什么呢

改變新的變數會影響到原始變量,這種賦值操作更加快速。
注意:只有命名變數可以傳遞位址賦值,就是說,改變了$bar的值,也就改變了$foo的值了。

另一個例子:

$_GET[1] = 1;
function &a()
{
 $a = $_GET[1];
 return $a;
}
$x =& a();
$x = 'MoontoC';
echo $_GET[1]; // 此时这里会显示 MoontoC, 而不是最初赋值的1

你明白其中的意義了嗎, 使用函數傳值時必須雙方都使用引用符號才有意義,才能真正引用, 而任何一邊少了引用符號, 都不會得到錯誤的內容, 但內容是傳值, 而不是傳引用了。沒有程序基礎的人最初學php的確很難理解傳值和傳引用的重要性, 覺得反正都能得到自己要的東西, 其實不是的, 很多時候雖然得到的東西一樣, 但是代價卻完全不一樣,一個長達200萬字的值, 被當作值傳送就是400萬字同時放在內存中待用, 多耗費一倍內存的意思,而傳引用就只是一個快捷方式傳送過去而已。

以上是php在函數和變數前面加上 @和$符號的差異詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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