在PHP中使用'func_get_arg'的好例子是什么?

时间:2011-03-11 01:40:41

标签: php

我刚刚发现PHP中有一个名为func_get_arg的函数,它使开发人员能够使用获取参数的变体样式。 它似乎非常有用,因为参数的数量现在可以是任意的,但我想不出任何使用它的好例子。

使用此函数充分利用其多态特征的一些例子是什么?

7 个答案:

答案 0 :(得分:25)

我通常使用func_get_args(),如果想要多个参数,这更容易使用。

例如,要重新创建PHP的max()

function max() {
   $max = -PHP_INT_MAX;
   foreach(func_get_args() as $arg) {
      if ($arg > $max) {
          $max = $arg;
      }
   }
   return $max;
}

CodePad

现在,您可以执行echo max(1,5,7,3)并获取7

答案 1 :(得分:3)

首先,您使用的术语“多态”完全错误。多态性是面向对象编程中的一个概念,它与函数中可变数量的参数无关。

根据我的经验,所有func_get_args允许你做的是添加一点语法糖。

考虑一个可以获取任意数量的整数并返回其总和的函数。 (我在作弊,因为这已经存在于array_sum中。但如果让例子保持简单,作弊就是好的)。你可以这样做:

// you can leave "array" out; I have it because we should be getting one here
function sum1(array $integers) {
    return array_sum($integers);
}

现在你可以这样称呼它:

$sum = sum1(array(1));
$sum = sum1(array(1, 2, 3, 4));

这不是很漂亮。但我们可以做得更好:

function sum2() {
    $integers = func_get_args();
    return array_sum($integers);
}

现在你可以这样称呼它:

$sum = sum2(1);
$sum = sum2(1, 2, 3, 4);

答案 2 :(得分:2)

假设我们有多个包含数据的数组,我们需要在这些数据中搜索键的值而不合并这些数组。

数组就像:

$a = array('a' => 5, 'b' => 6);
$b = array('a' => 2, 'b' => 8);
$c = array('a' => 7, 'b' => 3);

在这种情况下,假设我们需要从所有数组中获取键a的所有值。我们可以编写一个函数,接受任意数量的数组进行搜索。

// we need the key, and at least 1 array to search in
function simpleSearchArrays($key, $a1){
    $arrays = func_get_args();
    array_shift($arrays); // remove the first argument, which is the key
    $ret = array();
    foreach($arrays as $a){
        if(array_key_exists($key, $a)){
            $ret[] = $a[$key];
        }
    }
    return $ret;
}

所以如果我们使用函数:

 $x = simpleSearchArrays('a', $a, $b, $c);
然后

$x将包含array(5, 2, 7)

答案 3 :(得分:1)

我几乎没有使用func_get_arg(),但我确实使用了它的堂兄func_get_args()。这是一个例子,一个函数沿着echo语句的行,该实体对其所有参数进行编码:

function ee() {
    $args = func_get_args();
    echo implode('', array_map('htmlentities', $args));
}

我使用了那个功能。

这是另一个有用的例子,一个与SQL的COALESCE()函数完成相同工作的函数。

function coalesce() {
    $args = func_get_args();
    foreach ($args as $arg) {
        if (!is_null($arg)) {
            return $arg;
        }
    }
    return null;
}

它返回传入的第一个非null参数,如果没有这样的参数,则返回null

答案 4 :(得分:1)

就个人而言,我认为在正常功能中没有一个好的用例。作为一个控制狂,我想知道究竟是什么传递给我的函数,我想知道我到底要传递的是什么。

但是,它可以用于动态/静态URL路由之类的内容。当您重写(通过mod_rewrite)时,URL会引导到单个引导程序。

从这个意义上讲,您可以拥有不一定需要与每个页面请求一起存在的参数。

答案 5 :(得分:1)

从php5.6开始,不再有func_get_arg的用例;并不是说它的功能不再需要,而是使用...语法替换为variadic function

/**
 * @param array $arguments
 */
public function poit(...$arguments)
{
     foreach($arguments as $argument) {
         ...
     }
}

如果最后有方法过载,这尤其有用;我们需要过滤掉第一个参数,如an example所示:

使用func_get_arg的旧样式:

function foo($a, $b) {
    $c = array();
    if (func_num_args() > 2) {
        for($i = 0; $i < func_num_args()-2; $i++) {
            $c[] = func_get_arg($i+2);
        }
    }
    var_dump($a, $b, $c)
    // Do something
}
foo('a', 'b', 'c', 'd');

更新的可变风格;

function foo($a, $b, …$c) {
    var_dump($a, $b, $c);
    // Do something
}
foo('a', 'b', 'c', 'd');

两个foo都产生相同的输出,一个更容易编写。

答案 6 :(得分:0)

阅读官方文件,发现func_get_args()
获取函数参数列表的数组。

此函数可与func_get_arg()func_num_args()结合使用,以允许用户定义的函数接受可变长度的参数列表。

<?php
        function foo()
        {
            $numargs = func_num_args();
            echo "Number of arguments: $numargs \n";
            if ($numargs >= 2) {
                echo "Second argument is: " . func_get_arg(1) . "\n";
            }
            $arg_list = func_get_args();
            for ($i = 0; $i < $numargs; $i++) {
                echo "Argument $i is: " . $arg_list[$i] . "\n";
            }
        }

        foo(1, 2, 3);
?>