`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;
也意味着空虚,不是吗?
null
、undefined
或 None
。我可能错了,但我认为 C/C++ 有所不同
对,对不起,我的意思是在 C/C++ 中。【参考方案7】:
我不是专家,但我会说,如果差异可以忽略不计;有人可能会争辩说,您通过返回来耗尽叮咬;或返回假;在函数的末尾。
通常我使用 return 之类的东西
return true;
或
return $var;
如果我不想返回任何东西或者我想返回 false 我只是不使用 return
【讨论】:
但是return;
和return false;
有很大的不同。
是的,它们返回将返回 null 并返回 false;将返回假;不过我看不出你在说什么?
你说:“如果我不想返回任何东西,或者我想返回 false,我只是不使用 return”。那么如果你想返回false,你应该返回一些东西:false
。
是的,但评估为布尔值,即真或假 null 与假相同,不是吗?
是的,我们都知道。但我一直在寻找答案中的细节。真的没关系。我们都知道我们的意思。偶尔返回值""
、NULL
和FALSE
会做非常不同的事情。其他时候,他们的做法完全相同。【参考方案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 中,您有 procedures
和 functions
。第一个不返回任何数据,它们只是执行一些语句。函数可以返回数据。
所以一个空的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有啥区别