php中return,require,include加括号和不加括号的区别

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 的值)。

这句话大家可能还不是很理解,看看下面的测试代码:

1
2
3
4
5
6
7
8
9
10
11
12

$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”

如果在返回变量中加括号,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12

$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 在返回引用的时候加上括号不但效率低而且会造成逻辑错误,

你可能感兴趣的:(php)