为什么我们应该总是从函数返回值?

时间:2012-09-10 11:18:56

标签: php function return

我不是一个很棒的编程人员,但是我很多时候都会从程序员那里听到我们应该总是从函数中返回值。我想知道原因。

9 个答案:

答案 0 :(得分:7)

这是旧编程的遗产。在像Fortran这样的旧语言中,你总是必须返回类型为int,float,bool等的东西。因为C你可以返回一个“void”类型,如果你没有指定一个,那么这是大多数C函数的默认值。 return语句,最后返回void。例如,在Java中,您必须指定返回类型,然后使用该类型返回。如果您不想返回任何内容,请使用'void'类型:

//This works
public void boo() {
   return;
}


//This gets you an error
public int boo() {
   return;
}

//This gets you an error too, because you must specify a type for any function in Java
public boo() {
   return;
}

所以它更像是Lix所说的,如果你有什么东西可以回来,你就可以。在大多数功能程序中,您的函数可以返回数据,也可以返回true / false标记成功或失败。在许多系统中,函数可以返回指示成功或失败的int,如'1'或'-1'。 Unix shell程序使用它。

在其他语言如PHP中你不需要返回任何东西,但在后台PHP仍然附加一个'void'类型作为返回值给你的函数,你只需要不必显式写它。

希望这有帮助

答案 1 :(得分:6)

这样做是为了让函数有一个明确的终点。它主要是为了提高可读性并帮助未来的程序员理解你想要做的事情。

不应该假设函数返回什么。

答案 2 :(得分:6)

一个函数不需要返回任何东西......如果你看一下C(++)函数,很多函数都没有(好吧,没有明确地说):

void nonReturningFunction(const int *someParam);
int main()
{
    int i = 12;
    nonReturningFunction(&i);
    return 0;
}
void nonReturningFunction(const int *someParam)
{
    printf("I print the value of a parameter: %d",someParam);
}

后者什么都不返回,好吧,它返回一个空白。主函数确实返回了一些内容:0,这通常是系统发出的信号,让它知道程序已经完成,并且完成得很好。

同样的逻辑适用于PHP或任何其他编程语言。某些函数的返回值是相关的,可能不需要其他函数来返回任何内容。通常,函数返回值,因为它们与程序流相关。

上课,例如:

<?php
    class Foo
    {
        private $foo,$bar;
        public function __construct()
        {
            $this->foo = 'bar';
        }
        public function getFoo()
        {
            return $this->foo;//<-- getter for private variable
        }
        public function getBar()
        {
            return $this->foo;//<-- getter for private variable
        }
        public function setBar($val = null)
        {
            $this->bar = $val;
            return $this;//<-- return instance for fluent interfacing
        }
        public function setFoo($val = null)
        {
            $this->foo = $val;
            return $this;
        }
    }
    $f = new Foo();
    $f->setFoo('foo')->setBar('bar');//<-- fluent interface
    echo $f->getFoo();
?>

如果setter函数没有返回任何内容,则必须写:

$f->setFoo('foo');
$f->setBar('Bar');

因此,在这种情况下,返回值是相关的。另一个与他们无关的例子:

function manipulateArray(array &$arr)//<-- pass by reference
{
    sort($arr);
}
$arr = range('Z','A');
manipulateArray($arr);
var_dump($arr);//array is sorted

而不是:

function manipulateArray(array $arr)//<-- pass by copy
{
    sort($arr);
    return $arr;
}
$arr = range('Z','A');
manipulateArray($arr);
var_dump($arr);//array is not sorted!
$arr = manipulateArray($arr);//<-- requires reassign

在许多情况下,通过引用传递被认为是有风险的,这就是为什么后一种方法通常被认为更好的原因。因此,在许多情况下,函数不需要返回值,但它们完全相同,因为它使代码整体更安全。
这可能就是为什么你的印象是函数必须总是返回一个值。

答案 3 :(得分:5)

原因很多......

这对您的架构更好:函数接受参数,使用它们并返回预期结果。通过这种方式,您可以重复使用它并安排代码。

对于unit testing更好,您可以非常轻松地检查您的函数是否返回预期结果。

答案 4 :(得分:3)

一般来说,在计算机编程中,函数是一个可重用的代码单元,它接受一些输入(包括任何内容)并返回一个值。

某些语言与称为过程的函数具有相似的结构,这些是可重用的代码片段,它们接受一些输入(包括任何内容)并执行某些活动但不返回结果。

然而,有些语言可能没有后者作为语法结构,并且使用函数来实现过程。所以你在这里得到忽略结果的函数。另外一些语言可能没有要求实际强制代码从函数返回某些东西(即它们使用函数实现过程)。

因此,如果您只选择后者,那么您可以像@lix一样认为从函数返回内容是一种好习惯。主要原因是虽然函数可以像过程一样使用 - 调用者可以像函数一样调用它,并期望使用结果。请记住,测试代码是主要用例,它可能是遵循此约定的唯一原因。

我个人认为惯例就是答案。做任何最适合你的事情,但尝试总是这样做,如果你需要分歧 - 找到让用户知道的方法。

答案 5 :(得分:2)

另外:灵活性。从函数内部考虑echo ing vs return。例如,使用函数返回的truefalse,您可以根据需要修改视图中显示内容的方式。有一个字符串回显并没有给你这种灵活性。

答案 6 :(得分:1)

一些早期的语言有程序和功能。程序没有返回(他们只是做了一些事情)。函数返回了一些东我想有人认为没有必要同时使用这两个函数可能只是无效(如C中所使用的那样)。我刚刚编写了一个快速函数来将数据存储在数据库中。由于数据是在几个级别过滤的,因此错误的几率可以忽略不计,尽管如此,我在函数中包含了一个警报,它会回显错误,因此甚至不需要返回错误警报。 (这是一个内部站点,不会供公众使用)所以让函数返回任何内容是完全没必要的。

因为问题是我们为什么总是应该返回一个值,这不是为什么返回一个值有时候是好的,但是有什么理由要求我们应该总是返回一个值,并且没有正当理由要总是返回一个值。函数的价值。

答案 7 :(得分:0)

我总是取决于具体情况。例如,静态方法应始终返回某些内容,因为它们无法修改对象。但是如果您将方法的引用传递给该方法,则仍然可以执行此操作;例如引用变量(例如C ++上的指针),或者只是一个对象(像PHP中那样作为隐式引用传递)。以后的实践不是一个好方法,就好像您的方法会接收引用并修改定义该方法的相同类,为什么不使该方法成为非静态方法呢?如果您想拥有一种可以被各种类(可能是派生类或抽象类)重用的方法,则后者并不总是正确的。如今,对于IDE来说,最好还是声明返回的变量类型,因此解释器或编译器将在编译时间而不是运行时间上捕获很多错误。我认为,大多数语言并没有为您的问题强加简单的标准。

答案 8 :(得分:0)

在编写要记录到数据库的函数时,我想到了同样的问题。我不需要退货。我注意到在调用日志记录功能时,它返回null。经过一番调查,我发现,在PHP中,如果某个函数没有返回,则默认情况下它返回null。我也在php文档中找到了这一点:

PHP Documentation on function default value

所以我想-代替返回null,我应该返回一些有用的消息,然后返回一个字符串,提示“错误记录成功”