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

You*_*mon 5 php return function

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

Opi*_*Opi 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助


Lix*_*Lix 6

这样做是为了使函数有一个明确的终点.它主要是为了提高可读性并帮助未来的程序员了解您的目标.

关于函数返回的内容应该没有假设.


Eli*_*gem 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);
}
Run Code Online (Sandbox Code Playgroud)

后者什么都不返回,好吧,它返回一个空白.主函数确实返回了一些东西: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();
?>
Run Code Online (Sandbox Code Playgroud)

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

$f->setFoo('foo');
$f->setBar('Bar');
Run Code Online (Sandbox Code Playgroud)

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

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

而不是:

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
Run Code Online (Sandbox Code Playgroud)

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


Ala*_*blo 5

原因很多......

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

这对于单元测试更好,您可以非常轻松地检查您的函数是否返回预期结果.