func_get_arg()和。之间有什么区别

时间:2011-06-03 12:31:54

标签: php function arguments

这两个代码摘录分别在PHP中有什么区别?:

function eat_apple($apple)
{
    return true;
}

function eat_apple()
{
    $apple = func_get_arg(0);
    return true;
}

或者有区别吗?如果没有,func_get_arg()有什么意义?当然它有一些我不知道的目的吗?

5 个答案:

答案 0 :(得分:7)

func_get_arg(以及func_get_args)可以使函数具有可变数量的参数,因此称为variadic functions

array_merge为例,它将合并可变数量的数组。

答案 1 :(得分:1)

事实上,没有太大区别,标准传递的参数通常优于func_get_arg()

有两种情况,您可能希望使用func_get_arg()而不是使用已定义的参数:

  1. 如果您想拥有无限数量的参数。通常,使用单个数组参数可以更好地完成此操作,但有时您可能希望允许无限制的参数。以这种方式工作的函数的一个真实示例是PHP的内置printf函数。

  2. 如果您有一个复杂的函数,其中给出的参数数量可能会改变参数的用途和/或其数据类型。例如,传递单个参数可能会导致函数期望一个字符串,而传递两个参数,它可能首先需要一个整数,然后是字符串。我无法想到这个问题的任何例子,但我相当确定有一些。通常,我会说这种行为是不好的做法,但我可以看到在保持向后兼容性的同时添加功能可能有用。

  3. 如果使用fung_get_arg()而不是标准函数参数,肯定会丢失两件事:

    1. 通过引用传递的能力。

    2. IDE可以执行任何类型提示或自动完成。

答案 2 :(得分:1)

  

您好。这两个代码摘录分别在PHP中有什么区别?:

-function eat_apple($apple)
+function eat_apple()
 {
+    $apple = func_get_arg(0);
     return true;
 }

  

func_get_arg()有什么意义?当然它有一些我不知道的目的吗?

官方声明的目的是:

  

从参数列表中返回一个项目

     

- http://php.net/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)

有几个原因:

  1. 您可以使用该魔法来模拟重载
  2. 您可以编写函数(如printf),它可以使用不确定数量的参数。
  3. 第一个例子:

    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());
    }