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

jcu*_*bic 1 php return-value parentheses

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

这有什么区别:

function foo($x) {
   return (bar::baz($x));
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

function foo($x) {
   return bar::baz($x);
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*n D 6

正如其他人所提到的,它们在功能上几乎相同.如文档中所述:

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

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

注意:请注意,由于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));
Run Code Online (Sandbox Code Playgroud)

以下是结果:

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
Run Code Online (Sandbox Code Playgroud)

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

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