`return;` 和 no return 有啥区别?

Posted

技术标签:

【中文标题】`return;` 和 no return 有啥区别?【英文标题】: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。 【参考方案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

【讨论】:

以上是关于`return;` 和 no return 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

React 组件生命周期:render 和 return 之间有啥区别,return 之后会发生啥?

return (string expr) 和 return New String(string expr) 有啥区别?

MFC的OnInit()函数中的return true和return false有啥区别

c语言exit和return有啥区别

Sender、From 和 Return-Path 有啥区别?

承诺。 return resolve() 和 resolve() 有啥区别?