2010-09-14 119 views
6

从一个函数忽略返回的值。例如:有点毛病在PHP

// somefile.php 
function doSomething() { 
    // do lots of code, whatever... 
    return $something; 
} 

// mainfile.php 
include "somefile.php" 
doSomething(); // ignored the return value, we don't need it here 

当PHP函数返回一个值,但我们不关心它,会发生什么?这种行为有什么问题,或者即使我们永远不会在函数范围之外使用它,我们是否应该始终获取变量? PHP如何通过返回一个不会在函数范围之外使用的值来管理资源?

+0

如果你返回一些东西但不需要它,那么你为什么要返回“某物”。 ?只是做一个回报; – RobertPitt 2010-09-14 13:59:17

+0

Thomas Clayson给出了一个这样的函数“mysql_query”下面的完美例子。也许我应该更好地解释自己......并不是永远不需要返回值,这只是我可能需要它,或者可能不需要。我想给用户选择。 – 2010-09-14 14:32:20

回答

11

返回值被丢弃。这样做没有任何问题。即使没有明确的return功能做回null含蓄:

function foo() {} 
var_dump(foo()); // NULL 
+0

只是为了增加...想想'mysql_query()'。你可以自己运行'mysql_query()',或者你可以把它的返回值赋给一个变量。 :)不管你是否忽略它,所有的代码仍然运行。 – 2010-09-14 13:49:48

+0

@Thomas Clayson:当然,如果你需要返回的值进行进一步处理,你需要以某种方式处理它。但是,如果没有,则不需要存储它。 – Gumbo 2010-09-14 13:52:09

+2

+1对于“即使没有明确返回的函数也会隐含地返回null:” – RobertPitt 2010-09-14 14:03:26

2

它的代码味道,每次返回的是不会被使用的东西时间意味着你没有,你的受众的想法 - 你可能会丢失一些其他的概念。

此外,这些功能通常遭受Command Query separation

几个例子

  • array_unshift(&$arr, $value, ...)预规划传递值数组,并返回数组的新的大小,多久你想要的信息?如果你这样做,你总是可以拨打count($array)这是专为此目的而设计的。

  • sort(&$arr) sorts传递数组,如果成功则返回。是否有意义?当发生错误时你应该知道,异常应该被引发/错误触发,你是否真的想一直测试成功?你呢?

  • print_r()是一个超级例子,它根据传入的参数返回true(总是如此无用)或字符串。这绝对不是api的样子。

一个可能的例外可能是流畅的界面,如jQuery但就是非常具体案例。

提示:写几个测试并重新考虑你的架构,如果它确实没有任何其他意义,它可能已经足够了。但在这种情况下你应该小心。

+0

-1:那些* some *调用函数需要返回值而另一些不需要?你的一些例子实际上可能是糟糕的API设计的例子,但通常情况下,一些调用者需要返回值而不是其他的。 – Gravity 2011-10-03 03:48:32

+0

这正是我所说的 - 当“某些”呼叫不需要这个值时,你在API设计中失败了。根本不应该返回,或者仅在因为返回值而调用函数时才返回。 CQS就是这样。 – 2011-10-03 07:37:45

+0

我刚刚重读了你的答案 - CQS不是一个选项,它是必须的 - 混合查询和命令一起导致难以维护的代码。 CQS应该与避免静态/全局是相同的工具箱。 – 2011-10-03 07:44:57

2

它没有问题。如果你有一个函数返回一个值,但也会以某种方式改变程序的状态(称为副作用),调用函数但忽略返回值只会导致所有的副作用被应用。当然,如果你没有存储它,你将无法使用返回值,但有时你想要的仅仅是调用的副作用。

有一些人相信设计API的方式,使得被称为副作用(命令)和函数的函数被调用来尽可能地分离程序(查询)的某些状态。这个原则被称为Command-Query Separation。这个想法是,所有返回事物的函数都不应该修改程序的状态,因为它们正在观察它,观察行为不应该影响观察到的状态。所有不返回任何东西的函数都被视为命令,专门用于其副作用。

因此,遵循这些原则的人可能会认为,由于你的函数明显应用副作用(或者你为什么要调用它而不关心返回值?),它不应该观察任何状态(有返回值) 。但是,请注意,这个原则并不总是要遵循这封信,并且也没有达成一致。

为什么有些人提倡命令查询分离?因为如果在查询之间没有应用命令,它可以确保连续查询返回相同的答案。这是一种不可变性的弱化形式,并且具有不变性可用于推理程序逻辑的优点的弱化形式。一致地应用时,对象在命令之间是不可变的。

在我看来,记住这个原则通常会导致API更少且程序逻辑更清晰,但不应过多。有时您可能需要应用副作用并返回一个值。但是,当返回值只是成功值时,请考虑在失败时引发异常。

1

返回只是一种将函数内部的变量传递给函数以外的方法。除非函数被设置为静态,否则函数中的变量将被销毁。为了保留这个值,你可以分配一个变量来存储它。

代码中不需要返回变量是很常见的。事实上,不需要返回变量并不意味着没有用于返回变量。

即使允许返回的函数或方法死掉也没有不良影响,但这通常是不好的做法。当开发者创建回报时,它有一个原因。这个原因可能是一些事情,例如:函数的效果除了返回外可能没有结果(这个例子不太可能落入你的情况),返回的结果可能是顺序操作的参考,返回的结果可能用于调试。

我建议你找到返回结果的意图并相应地处理它。通常,忽略返回结果可能会在您的应用程序中引入可预防的不可预测状态。

例如,array_walk()。它通过引用处理你的数组,假设一切顺利,没有必要为标准执行存储返回变量;然而,如果它失败了,你无法知道,如果你自动认为它没有失败,你的应用程序可能会失败或给出意想不到的结果。如果您已经收集了该返回变量并且发现它是错误的,那么您可能会引发异常,试图找出原因并再次尝试,或记录该异常以备将来参考。

7

对我来说,所有的碗到一个简单的模式:

“的函数应该做的一两件事。它应该做得很好。它只应该这样做。“

如果您有多个原因调用该函数的功能很多。


语言的角度来看也绝对有无视的返回值没有问题。从清洁代码的立场有。

一个insert()函数应该在数据库中插入一条记录。不返回插入记录的ID。你没有要求那个。

一个setLatitude()应该修改的对象内部状态不加载你的时区类和人物在时区纬度是和他们写的数据库。 (保存对象可以做到这一点)。


如果你有两个理由来称呼它提供一个以上的目的,但从因此它干净的代码点的函数:“是否太多”

当然可以有案件结构在那里它可以是有道理的,但作为一般的经验法则,忽视返回值可能是一种代码味道。