【问题标题】:What's the difference between `return;` and no return?`return;` 和 no return 有什么区别?
【发布时间】:2011-08-26 11:36:09
【问题描述】:

有没有区别:

function someMethod( $someArg ) {
  // some code
  return;
}

function someMethod( $someArg ) {
  // some code
  // no return
}

两者都将NULL 作为“返回值”。有区别吗? PHP 内部的东西?表现?速度?

编辑
我问,因为在 Zend 框架(in this video)中,他们使用return;,这对我来说似乎(似乎)很傻。但是,您会认为 Zend 框架背后的人确实知道他们的 PHP...

【问题讨论】:

  • 一个新的noreturn 类型将在php-8.1 中引入,相信你会感兴趣。检查rfc here

标签: php function methods return-value


【解决方案1】:

php代码

<?php

function a() {
   echo 1;
   return;
}

function b() {
   echo 2;
}

生成的字节码

.FUNCTION a
        ECHO                     1
        RETURN                   NULL
        RETURN                   NULL
        HANDLE_EXCEPTION         
.END FUNCTION

.FUNCTION b
        ECHO                     2
        RETURN                   NULL
        HANDLE_EXCEPTION         
.END FUNCTION

所以显式的 return 语句会生成一个额外的 RETURN 指令。否则没有区别。

【讨论】:

  • 这正是我的意思。我会说使用return; 对性能不是更好,因为它添加了额外的命令。如果没有指定return;,则无论如何都会在内部指定一个返回值。我没看错吗?
  • @Rudie:不,没有更糟,因为只执行了第一个RETURN NULL。但即使是这样,你也不会注意到差异。不要过早优化。
  • @Marcel 这就是为什么我没有说它更糟,而是“对性能来说并没有更好”。我不想优化,只是好奇。我听说这很好。
  • @Marcel - @stereofrog 是正确的,性能差异是如此微不足道,以至于被认为是零,因为甚至不会执行第二次返回
  • 可能不会执行第二次返回,但可能会发生额外的解析等。仅仅因为某些东西很小,并不意味着您应该忽略它。如果您只是遵循省略不必要的返回语句的做法(最佳做法???),则不能武断地称这种过早优化。
【解决方案2】:

据我所知没有区别。

空的return; 主要用于从 if/else、while 或 for 循环中跳出而不返回任何内容。

【讨论】:

    【解决方案3】:

    在功能上没有区别,但在函数中有一个明显的退出点(返回)总是很好的。一些计算机科学流派认为所有的函数和方法都应该精确地有 1 个,并且只有 1 个出口点。

    如果您将来需要添加一个返回值,那么如果您包含一个空的返回值,那么在代码中已经为您挑选了一个明显的点。

    但就像我说的,从功能的角度来看并没有太大的区别。

    【讨论】:

      【解决方案4】:

      在你的例子中,没有区别。

      但是,return 将终止函数,因此您可以选择在 return 语句之后跳过代码(这就是它的目的)。

      在您的示例中,您是否喜欢查看return 是个人喜好。

      此外,在 Perl 等某些语言中,最后一个表达式是“隐式”返回值,因此您甚至不需要使用“return”。 (不过,这不适用于 C++ 等其他语言。)

      sub foo {
        return 12;
      }
      
      sub foo2 {
        12;  # same thing
      }
      

      【讨论】:

      • 我可能错了,因为我对 perl 语法很模糊,但 foo 和 foo2 不会返回相同的值。 foo 返回值 12,其中 foo2 不返回任何内容
      • 在 Perl 中,返回值是“最后评估的表达式”的值,所以两者都会返回相同的东西。 (奇怪,但那是 Perl。;-))devshed.com/c/a/Perl/Returns-and-Perl-Subroutines/2
      【解决方案5】:

      没有大的区别,您可以使用return; 提前退出函数调用。无论哪种方式,他们都会返回NULL,这完全是为了工作流。

      【讨论】:

        【解决方案6】:

        在 PHP 和 Python 等语言中没有真正的区别。 return; 可用于提前退出函数。

        However, there is a difference when the programming language of choice is C/C++, Java, C#, where no return signifies a void

        【讨论】:

        • 但是return; 也意味着空虚,不是吗?
        • nullundefinedNone。我可能错了,但我认为 C/C++ 有所不同
        • 对,对不起,我的意思是在 C/C++ 中。
        【解决方案7】:

        我不是专家,但我会说,如果差异可以忽略不计;有人可能会争辩说,您通过返回来耗尽叮咬;或返回假;在函数的末尾。

        通常我使用 return 之类的东西

        return true;
        

        return $var;
        

        如果我不想返回任何东西或者我想返回 false 我只是不使用 return

        【讨论】:

        • 但是return;return false; 有很大的不同。
        • 是的,它们返回将返回 null 并返回 false;将返回假;不过我看不出你在说什么?
        • 你说:“如果我不想返回任何东西,或者我想返回 false,我只是不使用 return”。那么如果你想返回false,你应该返回一些东西:false
        • 是的,但评估为布尔值,即真或假 null 与假相同,不是吗?
        • 是的,我们都知道。但我一直在寻找答案中的细节。真的没关系。我们都知道我们的意思。偶尔返回值""NULLFALSE 会做非常不同的事情。其他时候,他们的做法完全相同。
        【解决方案8】:

        只要调用return,函数调用就会终止。它就像一个休息时间。所以如果你的 return 在中间,它会获得一些性能,因为函数的其余部分没有被执行。

        对于其余部分,使用显式返回而不是隐式返回通常更好(以可读性方式)。如果您将返回值保留在函数中,您将知道对该函数的调用可能需要返回值。

        【讨论】:

          【解决方案9】:

          return 将中断/退出函数(认为 break 就像在 switch/case 中一样)

          function someMethod( $someArg ) {
              if(condition) {
                  return; // will exit function
              }
          
              // could be more code
          }
          

          【讨论】:

            【解决方案10】:

            我有时喜欢使用“空”return 作为函数的最后一个语句,以友好地提醒该函数不会返回任何值。

            class foo {
              var $name;
            
              public function bar($x) {
                $this->name = $x;
                return;
              }
            }
            

            在 ADA 中,您有 proceduresfunctions。第一个不返回任何数据,它们只是执行一些语句。函数可以返回数据。

            所以一个空的return 就像'这是一个过程'。

            【讨论】:

              【解决方案11】:

              非常有趣(我认为),有一个返回类型有很大的不同。三种返回null 抛出三种不同的错误:

              function foo() : string {
                // return nothing
              
                // TypeError exception: Return value of foo() must be of the type string, none returned
              }
              
              function foo() : string {
                return;
              
                // Fatal error: A function with return type must return a value
              }
              
              function foo() : string {
                return null;
              
                // TypeError exception: Return value of foo() must be of the type string, null returned
              }
              

              我没想到,因为所有错误都是运行时的,所有返回值在技术上都是null

              【讨论】:

                猜你喜欢
                • 2014-05-24
                • 2015-11-04
                • 1970-01-01
                • 1970-01-01
                • 2013-08-25
                • 1970-01-01
                • 1970-01-01
                • 2013-12-25
                • 2018-05-16
                相关资源
                最近更新 更多