为什么用括号包装返回值?

时间:2012-07-31 20:24:30

标签: php return-value parentheses

我正在阅读Pro PHP Programming,在示例中,作者使用围绕返回值的括号

这有什么区别:

function foo($x) {
   return (bar::baz($x));
}

和此:

function foo($x) {
   return bar::baz($x);
}

2 个答案:

答案 0 :(得分:6)

正如其他人所提到的,它们在功能上几乎相同......如上所述in the documentation

  

注意:您不应该在返回变量周围使用括号   通过引用返回时,因为这不起作用。你只能   通过引用返回变量,而不是语句的结果。如果你   使用return($ a);然后你没有返回一个变量,而是结果   表达式($ a)(当然,这是$ a的值)。

PHP手册还注意到避免使用括号的(小)性能优势编辑...请参阅下面的基准编辑

  

注意:请注意,因为return是语言结构而不是   函数,不需要围绕其参数的括号。   将它们遗漏是很常见的,你实际上应该像PHP一样   在这种情况下,做的工作较少。

为了安全起见,可能值得避开括号。

BENCHMARKING / EDITS

我决定把php.net的注释放到测试中,看看PHP在括号中没有返回值的情况下要做的“少工作”。答案:即使按微优化标准,也不值得担心。我设置了这个测试(v5.3),通过两个相同的函数循环100,000次:

function test1(){
    //do something
    $a=1;
    return $a;
}

function test2(){
    //do something
    $a=1;
    return ($a);
}

$array = array();

for($j=0;$j<100;$j++){
    $array[$j] = array();
    $time = microtime(true);

    $val = 0; //set a dummy variable
    for($i=0;$i<100000;$i++){
        $val = test1();
    }

    $array[$j][0] = microtime(true)-$time;

    unset($i);
    unset($val);
    unset($time);

    $time = microtime(true);

    $val = 0; //set a dummy variable
    for($i=0;$i<100000;$i++){
        $val = test2();
    }

    $array[$j][1] = microtime(true)-$time;
    unset($i);
unset($val);
unset($time);
}

$without_p = 0;
$with_p = 0;
foreach($array as $values){
    $without_p +=$values[0];
    $with_p +=$values[1];

    echo $values[0].' vs '.$values[1]."\n"; 
}
echo "---------------\nAverages: \n".($without_p/count($array))." vs ".($with_p/count($array));

以下是结果:

0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.03200101852417
0.02800178527832 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.03200101852417
0.028002023696899 vs 0.028002023696899
0.03200101852417 vs 0.02800178527832
0.032002210617065 vs 0.028000831604004
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.028000831604004 vs 0.032002210617065
0.02800178527832 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.028000831604004
0.032002210617065 vs 0.028002023696899
0.032001972198486 vs 0.028000831604004
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.028000831604004 vs 0.032002210617065
0.028002023696899 vs 0.032000780105591
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.028002023696899 vs 0.032001972198486
0.032001972198486 vs 0.03200101852417
0.032001972198486 vs 0.032001972198486
0.028002023696899 vs 0.03200101852417
0.032001972198486 vs 0.032001972198486
0.028002023696899 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.02800178527832 vs 0.032002210617065
0.028000831604004 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.03200101852417 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.028002023696899 vs 0.032001972198486
0.028000831604004 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.028000831604004
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.03200101852417 vs 0.028002023696899
0.028002023696899 vs 0.03200101852417
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.028002023696899 vs 0.032001972198486
0.028000831604004 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.032001972198486 vs 0.032001972198486
0.028001070022583 vs 0.028002023696899
0.032001972198486 vs 0.032001972198486
0.028001070022583 vs 0.028002023696899
0.032001972198486 vs 0.028000831604004
0.032002210617065 vs 0.028002023696899
0.032000780105591 vs 0.028002023696899
0.028002023696899 vs 0.03200101852417
0.028002023696899 vs 0.028002023696899
0.03200101852417 vs 0.028002023696899
0.032001972198486 vs 0.028002023696899
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.032000780105591
0.028002023696899 vs 0.028002023696899
0.03200101852417 vs 0.028002023696899
0.028002023696899 vs 0.03200101852417
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.028002023696899
0.032001972198486 vs 0.028000831604004
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.032001972198486
0.028002023696899 vs 0.028001070022583
0.032001972198486 vs 0.032001972198486
0.032001972198486 vs 0.032001972198486
0.032001972198486 vs 0.03200101852417
0.032001972198486 vs 0.028002023696899
0.032001972198486 vs 0.028001070022583
0.028002023696899 vs 0.032001972198486
0.028001070022583 vs 0.028002023696899
--------------- Averages: 
0.030041754245758 vs 0.029521646499634

所以(通过运行此测试100次平滑外部效果)100,000次循环后的总影响仅为0.0005秒。这里的基本结论是,这里的性能损失(至少在处理时间方面)很小......到了甚至在100,000次循环之后,版本括号有时比更快使用推荐的裸体回归。

当然,它仍然值得避免,因为你最终会尝试通过引用返回某些点并且花费数小时试图找到错误来源的危险,但是性能确实不是一个有效的论据。 / p>

答案 1 :(得分:4)

似乎只是作者使用的编码风格约定。他可能认为它更清晰,既易于阅读,也更容易让新手理解。但它实际上对返回的值没有任何影响。