忽略PHP中函数的返回值有问题

时间:2010-09-14 13:42:34

标签: php function return-value

例如:

// 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如何通过返回一个不在函数范围之外使用的值来管理它的资源?

5 个答案:

答案 0 :(得分:11)

返回值被丢弃。这样做没有错。即使没有明确return的函数也会隐式返回null

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

答案 1 :(得分:7)

对我来说,这一切都归结为一个简单的范例:

  

“一个功能应该做一件事。它应该做得很好。它应该只做它。“

如果您有多个理由要求该功能可以做很多事情。


语言角度,忽略返回值绝对没有问题。从清洁代码的立场开始。

insert()函数应在数据库中插入记录。不返回插入记录的id。你没有要求。

setLatitude()应修改对象内部状态,不加载Timezone类,并确定该纬度所在的时区,并将其写入数据库。 (保存对象可以做到这一点。)


如果你有两个理由来调用一个函数它有多个目的,那么从一个干净的代码的角度来看它就是:“太多了”

当然可以构建一些可以理解的案例但是作为一般经验法则,忽略返回值可能是代码气味。

答案 2 :(得分:2)

这是代码味道,每次你返回一些不会被使用的东西意味着你对你的观众没有任何想法 - 你可能会错过其他一些概念。

此外,此类功能通常会受到Command Query separation的影响。

几个例子

  • array_unshift(&$arr, $value, ...) prepends将值传递给数组并返回新的数组大小,您多久需要这些信息?如果你这样做,你可以随时拨打专为此目的设计的count($array)

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

  • print_r()就是这样的例子,它返回true(总是这样它无论如何都是无用的)或字符串,这取决于你传入它的参数。这绝对不是api的样子。

一个可能的例外可能是流畅的界面,比如jQuery,但这是非常特定情况。

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

答案 3 :(得分:2)

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

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

遵循这些原则的人可能会认为既然你的功能明显地应用了副作用(或者为什么你会调用它而不关心返回值?),它就不应该观察任何状态(有一个返回值)。但请注意,这一原则并不意味着始终遵循这一原则,并且也没有就此达成一致意见。

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

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

答案 4 :(得分:1)

返回只是一种从函数内部传递变量的方法,以便在函数外部使用。除非将变量设置为静态,否则将破坏函数中的变量。为了保留这个值,你可以指定一个变量来存储它。

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

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

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

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