我不是一个很大的编程人员,但有很多次从程序员那里听我们应该总是返回一个函数的值。我想知道原因。为什么我们应该总是从函数返回值?
回答
函数不需要返回任何东西......如果你看看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);
}
后者没有任何返回,它返回一个void。主函数确实返回了一些内容: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
传递被认为在许多情况下,有风险的,这就是为什么后者的做法被普遍认为是更好的。因此,在很多情况下,这些函数不需要返回值,但它们都是一样的,因为它使代码更安全。
这可能是为什么你的印象是功能必须始终返回值之下。
这样做是为了使函数有一个确定的终点。这主要是为了提高可读性并帮助未来的程序员理解你想要做的事情。
不应该假定函数返回什么。
有这么多的理由......
这对你的架构更好的:一个函数需要的参数,与他们合作,并返回预期的结果。通过这种方式,您可以重新使用它并安排您的代码。
这对unit testing更好,你可以很容易地检查你的函数是否返回预期结果。
一般来说,在计算机编程中,函数是一个可重用的代码单元,它需要一些输入(不包括任何内容)并返回一个值。
一些语言与被称为过程的函数具有相似的构造,这些是可重用的代码片段,需要一些输入(不包括任何内容)并执行一些活动但不返回结果。
然而,有些语言可能没有把后者作为一种语法结构,我可以使用函数来实现过程。所以你在这里得到了忽略结果的功能。另外一些语言可能没有要求实际强制代码从函数返回某些东西(即它们使用函数实现过程)。
所以如果你只有后者作为你的选择,那么你可以像@lix一样争辩说,从函数返回事情是一个好习惯。主要原因是虽然函数可以像过程一样使用 - 调用者可以像函数那样调用它,并期望与结果一起工作。请记住,测试代码是一个主要用例,它可能是遵循此惯例的唯一原因。
就我个人而言,我认为约定就是答案。尽你所能,尽力做到最好,如果你需要分歧 - 找到方法让用户知道。
另外:灵活性。从函数内部考虑echo
ing和return
。例如,从函数中返回true
或false
,您可以按照需要以多种方式修改视图中显示的内容。有一个字符串回声不会给你这种灵活性。
这是旧编程的遗产。在像Fortran这样的老式语言中,你总是必须返回一些类型,例如int,float,bool等。由于C可以返回一个“void”类型,并且这是大多数C函数中的默认值,如果你没有指定返回语句,最后返回void。例如在Java中,您必须指定返回类型,然后返回该类型。如果你不想返回任何东西,你可以使用“无效”类型:
//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说,如果你有一些与回报,你怎么做。在大多数功能程序中,您的功能可以返回数据,或者真/假标记成功或失败。在许多系统中,一个函数可以返回一个int,指示成功或失败,如'1'或'-1'。 Unix shell程序使用这个。
在PHP你并不需要返回任何其他语言,但会在后台PHP还附加一个“无效”类型返回值的函数,你只是没有明确地写出来。
希望这有助于
这将解释所有返回0而不是我最近看到的无效。 – Steinin
一些早期的语言有过程和函数。程序没有任何返回(他们只是做了一些事情)。函数返回的东西。我想有人认为这是不必要的,因为一个函数可能只是无效的(在C中使用)。我刚写了一个快速函数来将数据存储在数据库中。由于数据在多个层次被过滤,所以错误的几率可以忽略不计,但是,我在函数中包含了一个警报,它会在错误中回显,因此不需要返回错误警报。 (这是一个内部网站,不会公开使用),因此让函数返回任何内容都是不必要的。
由于问题是为什么我们应该总是返回一个值,这不是为什么有时候返回一个值有时是好的,但是有什么理由要求我们应该总是返回一个值,并且没有任何正当的理由总是返回来自函数的值。
- 1. 函数总是返回False。为什么?
- 2. 我应该总是从一个函数返回一个有意义的值:PHP
- 3. 为什么我的函数总是返回false?
- 4. 为什么我的函数登录Curl总是返回true? CodeIgniter
- 5. 为什么我的jQuery AJAX函数总是返回false?
- 6. 为什么我的getservbyname函数总是返回NULL?
- 7. 为什么oci_num_rows总是返回0值?
- 8. C++函数应该返回什么?
- 9. 为什么他们总是使用数字作为返回码?
- 10. 为什么我们应该在button_press_event.handler的末尾返回True?
- 11. 值总是返回0,它应该返回插入的行数
- 12. 为什么我的函数不返回返回值?
- 13. 为什么我不能从Java中的void函数返回值?
- 14. 为什么我不能从主函数返回更大的值?
- 15. 函数的返回值是什么?
- 16. 为什么我的散列从函数返回时是空的?
- 17. 为什么我的DropDownList总是返回0值?
- 18. 为什么javascript函数返回NaN值?
- 19. 为什么函数返回这些值?
- 20. 为什么函数不返回值?
- 21. 为什么这个函数总是返回零?
- 22. 为什么isOpen()函数总是返回true?
- 23. 为什么getpwnam()总是返回函数中的根信息?
- 24. 为什么这个T-SQL函数总是返回true?
- 25. 为什么此函数总是返回“true1”
- 26. 为什么主函数总是需要一直返回?
- 27. 为什么下面的javascript函数总是返回true?
- 28. 为什么SQL函数总是返回空结果集?
- 29. 为什么这个函数总是返回0?
- 30. 为什么Backbone JS .extend()总是返回一个空函数?
作为反对做什么的? – Duniyadnd
RTFM:http://php.net/manual/en/function.return.php – diEcho
@diEcho - 链接到手动并没有真正回答这个问题在所有... – Lix