php中return,require,include加括弧和不加括弧的區別 2010年6月30日 小旅 發表評論 閱讀評論
在整理代碼規範的時候看到這麼一句,return傳回值盡量不要加括弧,這個是什麼原因呢。
查閱官方手冊,在http://cn2.php.net/manual/en/function.return.php 中發現這麼一句:
Note: You should never use parentheses around your return variable when returning by reference, as this will not work. You can only return variables by reference, not the result of a statement. If you use return ($a); then you’re not returning a variable, but the result of the expression ($a) (which is, of course, the value of $a).
翻譯成中文的意思是:
注意: 當用引用傳回值時永遠不要使用括弧,這樣行不通。只能通過引用返回變數,而不是語句的結果。你只能返回引用的變數,而不是使用一個運算式的結果。如果使用 return ($a); 時其實不是返回一個變數,而是運算式 ($a) 的值(當然,此時該值也正是 $a 的值)。
這句話大家可能還不是很理解,看看下面的測試代碼:
123456789101112 |
<?php$good = 'good chuzhi';$_SERVER['HTTP_HOST'] = 'hao';function &changeVariable(){ return $_SERVER['HTTP_HOST']; } $good = &changeVariable();var_dump($good);$_SERVER['HTTP_HOST'] = 'good';var_dump($good,$_SERVER['HTTP_HOST']); |
這段代碼輸出:
string(3) “hao”
string(4) “good”
string(4) “good”
如果在返回變數中加括弧,代碼如下:
123456789101112 |
<?php$good = 'good chuzhi';$_SERVER['HTTP_HOST'] = 'hao';function &changeVariable(){ return ($_SERVER['HTTP_HOST']); } $good = &changeVariable();var_dump($good);$_SERVER['HTTP_HOST'] = 'good';var_dump($good,$_SERVER['HTTP_HOST']); |
這段代碼輸出:
string(3) “hao”
string(3) “hao”
string(4) “good”
第一個例子中“return $_SERVER['HTTP_HOST']”;沒有加引號,返回的是$_SERVER['HTTP_HOST']的引用,這時$good和$_SERVER['HTTP_HOST']指向同一個變數。所以修改了$_SERVER['HTTP_HOST'],$good的值跟著變化。
而第二個例子 如果return 後面的變數加了括弧,則首先計算括弧括起來的這個運算式的值,然後返回計算後的結果。這樣$good 指向”($_SERVER['HTTP_HOST'])”計算的結果,和$_SERVER['HTTP_HOST']指向的變數不是一樣,自然修改了$_SERVER['HTTP_HOST']的值,$good的值保持不變。所以為了保險,return傳回值是能不加括弧就不加括弧。
從上面的列子可以推知require include後面加括弧和不加括弧的區別:
include “a.php”; //直接將a.php包含進來
include(“a.php”);//首先計算’(“a.php”)’的值,其結果肯定是a.php,然後在include “a.php”
require的道理和include一模一樣。
因此,include和require後面的檔案路徑加不加引號對執行結果是沒有影響的(不存在引用的問題),但是增加了執行步驟,降低了效率。
綜合以上的分析,無論是include,require還是return,對於這樣的操作符,後面能不加括弧就不加括弧。include和require後面加不加括弧對執行結果沒有區別,但是效率較低。而return 在返回引用的時候加上括弧不但效率低而且會造成邏輯錯誤,