【问题标题】:Why wraping return value with parentheses? [duplicate]为什么用括号包裹返回值? [复制]
【发布时间】:2012-07-29 17:02:04
【问题描述】:

我正在阅读 Pro PHP Programming 并且在示例中作者在返回值周围使用括号

这有什么区别:

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

还有这个:

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

?

【问题讨论】:

  • 语义上:2 个字符;功能上:没有。
  • 所有酷孩子都在做。

标签: php return-value parentheses


【解决方案1】:

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

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

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

注意:请注意,由于 return 是一种语言结构,而不是 函数,其参数周围的括号不是必需的。 将它们排除在外是很常见的,您实际上应该像 PHP 一样这样做 在这种情况下要做的工作更少。

为了安全起见,可能值得避免使用括号。

基准测试/编辑

我决定对 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 次循环之后,版本括号有时比括号快使用推荐的裸返回。

当然,这仍然值得避免,因为您最终会尝试通过引用返回,并且会花费数小时试图找到错误的根源,但性能确实不是一个有效的论据。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2012-02-08
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多