这两个代码摘录分别在PHP中有什么区别?:
function eat_apple($apple)
{
return true;
}
和
function eat_apple()
{
$apple = func_get_arg(0);
return true;
}
或者有区别吗?如果没有,func_get_arg()有什么意义?当然它有一些我不知道的目的吗?
答案 0 :(得分:7)
func_get_arg
(以及func_get_args
)可以使函数具有可变数量的参数,因此称为variadic functions。
以array_merge
为例,它将合并可变数量的数组。
答案 1 :(得分:1)
事实上,没有太大区别,标准传递的参数通常优于func_get_arg()
。
有两种情况,您可能希望使用func_get_arg()
而不是使用已定义的参数:
如果您想拥有无限数量的参数。通常,使用单个数组参数可以更好地完成此操作,但有时您可能希望允许无限制的参数。以这种方式工作的函数的一个真实示例是PHP的内置printf
函数。
如果您有一个复杂的函数,其中给出的参数数量可能会改变参数的用途和/或其数据类型。例如,传递单个参数可能会导致函数期望一个字符串,而传递两个参数,它可能首先需要一个整数,然后是字符串。我无法想到这个问题的任何例子,但我相当确定有一些。通常,我会说这种行为是不好的做法,但我可以看到在保持向后兼容性的同时添加功能可能有用。
如果使用fung_get_arg()
而不是标准函数参数,肯定会丢失两件事:
通过引用传递的能力。
IDE可以执行任何类型提示或自动完成。
答案 2 :(得分:1)
您好。这两个代码摘录分别在PHP中有什么区别?:
-function eat_apple($apple)
+function eat_apple()
{
+ $apple = func_get_arg(0);
return true;
}
func_get_arg()有什么意义?当然它有一些我不知道的目的吗?
官方声明的目的是:
从参数列表中返回一个项目
答案 3 :(得分:0)
我能想到的另一个可能的原因是避免致命的错误。
你有一个功能:
<?php
function display ($a, $b, $c) {
echo $a . " is " . $b . " " . $c;
}
?>
你可以打电话给
<?php
display ("Rock", "good", "boy");
- this will not throw any error.
display ("Rock", "good");
- this will throw fatal error.
?>
所以,现在想想第二个调用,你可以避免致命错误,看看有func_get_args
传递了多少个参数,并用func_get_arg(1)
等处理你的代码。
答案 4 :(得分:0)
printf
),它可以使用不确定数量的参数。class a{
function X(MyOBJ $obj){...}
}
class b extends a{
function X(string $s,int $i){...}
}
class c extends b{
function X(){...}
}
这将发出警告。如果在函数内部使用func_get_args()
来获取相关参数,则不会抛出任何警告。
//not good, you can only send 3 strings
function merge_strings($s1, $s2, $s3){
return $s1 . $s2 . $s3;
}
//good one
function merge_strings(){
return join('',func_get_args());
}