2012-01-05 55 views
26

函数是否应该返回null应该使用一个函数:return null;?

E.g.

function test() 
{ 
    return null; // vs return; 
} 

后者被认为是不好的做法还是无关紧要?

PS

不管是不好的做法不应该是主观的恕我直言。

+0

如果您有这表明'null'值意味着一些具体的事情,的做法,即函数的参数包含错误的数据 - 然后继续。但是,布尔返回通常绰绰有余。我在匿名函数中使用'null'来期望返回实际数据,所以boolean'false'被认为是可接受的返回值,但是'null'不是。 – ashein 2012-01-05 20:17:51

+1

我们可以得出结论,它是多余的,因为运行时已经这样做了。但是这并不会使它变得糟糕或无用。答案是明确的。更有趣的是,你不应该写'NULL'吗? – mario 2012-01-05 20:19:08

+0

@mario你的意思是'null'与'NULL'? – PeeHaa 2012-01-05 20:20:02

回答

18

如果您不返回任何内容,只需使用return;或者在函数结束时完全省略它。
如果您的功能通常会返回某些内容,但由于某种原因,请不要使用return null;

这与您的操作方式类似,例如在C中:如果你的函数没有返回任何东西,它是void,否则它通常会返回一个有效的指针或NULL。

+2

这对PHP有什么影响? PHP不是C. PHP中没有返回值与'NULL'完全相同,没有void变量类型。 – hakre 2012-01-05 20:19:18

+2

确实如此,但更清楚的是返回值可能会被调用者使用。 – ThiefMaster 2012-01-05 20:21:25

+0

除非没有任何文档,否则我很难说。你先读什么?函数体的最后一行或返回类型文档就在它的头部? – hakre 2012-01-05 20:22:44

38

总是一个很好的习惯来展示你回来的东西。

但作为一个尖,下面都是等效的:

function test() 
{ 
    return null; 
} 


function test() 
{ 
    return; 
} 


function test() 
{ 

} 

在所有情况下对var_dump(test());是:

NULL 
+9

第一句话+1。 :) – Herbert 2012-01-05 20:21:18

+7

最后一个函数示例非常清楚,没有什么可返回的。那么哪个例子在你的眼中显示得最好? – hakre 2012-01-05 20:24:02

+2

正如第一条评论...总是一个很好的习惯来展示你回来的东西。所以我的选择是第一个。 – devdRew 2012-01-05 20:28:17

6

PHP中的未定义的函数的返回值总是等于NULL,所以它没有任何区别(运行时会这样做)。

有什么不同之处在于,您可以使用docblocks并记录@return标签的返回值,以便在此处提供巧妙的IDE提供信息。

如果你想每不是,返回值是预期的docblock信号,您可以使用void

* @return void 

如果你想发出信号返回NULL意,您可以使用nullNULL (取决于你的代码风格的大写PHP标准常量):

* @return null 

或:

* @return NULL 

这应该使编码人员的意图可见,如通过PHP这总是null作为事实返回值。

往下看:

更多细节及更新的信息in PeeHaa's answer to this same question

0

从语义上讲,我不认为两者有区别。按照PHP documentation on return

如果没有提供任何参数,那么括号必须被省略 将返回NULL。

我个人喜欢把NULL放在那里。那么返回什么是没有问题的,这使得您的调试变得更容易一些。

+0

但是,“毫无疑问”是什么被返回只是'回来;'... – 2012-01-05 20:35:19

+0

这是真的。我想,我只是喜欢冗长。当我从现在开始,在深夜研究我的代码时,试图弄清楚什么是坏的,我喜欢把所有东西都放在我面前(没有任何暗示)。个人喜好。 – 2012-01-05 21:04:01

5

这实在是太傻返回null如果有什么返回。做return;显示没有实际返回任何东西的意图。并明确了该功能的功能。

PHP没有void返回类型的事实不应该成为让人不清楚的原因。还要注意的是PHP 7.1将提供支持the void return type

function test(): void { 
    return null; // this will error 
}