使用';func#u get#u arg';在PHP中?

使用';func#u get#u arg';在PHP中?,php,Php,我刚刚发现PHP中有一个名为func\u get\u arg的函数,它使开发人员能够使用不同的获取参数的方式。 它似乎非常有用,因为参数的数量现在可以是任意的,但我想不出任何使用它的好例子 使用此函数充分利用其多态特性的示例有哪些?我通常使用func\u get\u args(),如果需要多个参数,它更容易使用 例如,要重新创建PHP的max() 现在你可以做echo max(1,5,7,3)和get7我几乎不使用func\u get\u arg(),但我确实经常使用它的表亲func\u ge

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


使用此函数充分利用其多态特性的示例有哪些?

我通常使用
func\u get\u args()
,如果需要多个参数,它更容易使用

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


现在你可以做
echo max(1,5,7,3)
和get
7
我几乎不使用
func\u get\u arg()
,但我确实经常使用它的表亲
func\u get\u 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

我个人认为,在普通函数中,它没有好的使用案例。作为一个控制狂,我喜欢确切地知道传递给函数的是什么,也喜欢确切地知道传递的是什么

但是,它可以完全用于动态/静态URL路由之类的事情。当您正在重写(通过mod_rewrite)URL参数时,URL参数将变为单个引导


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

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

根据我的经验,
func\u get\u args
只允许您添加一点语法糖

考虑一个函数,它可以接受任意数量的整数并返回它们的和。(我在作弊,因为这已经存在于
array\u 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);

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

阵列如下所示:

$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
将包含
数组(5,2,7)

获取函数参数列表的数组

此函数可与
func\u get\u arg()
func\u num\u 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);
?>

从php5.6开始,不再有
func\u get\u arg的用例;这并不是说不再需要它的功能,而是使用
语法替换它:

/**
 * @param array $arguments
 */
public function poit(...$arguments)
{
     foreach($arguments as $argument) {
         ...
     }
}
如果有一些方法在最后被重载,这尤其有用;我们确实需要过滤掉第一个参数,如下所示:

使用
func\u get\u 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');

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

向下滚动到
示例
,然后阅读
用户提供的注释
sprintf
max
都是可以处理任意数量参数的函数的好例子。通常,您希望将其用于统一类型的参数。您的意思不是“多态性”:您要查找的术语是“可变的”:to
infrade()
。习惯的力量-我从PHP4.0出现后不久就开始用PHP编写代码。您知道,如果您不介意这个双关语的话,您可以将其简化为
array\u reduce(func\u get\u args(),max')
,它也适用于负数。@Keith也许我应该用这个初始数字
-PHP\u INT\u max
。唯一的问题是如果没有参数,答案是
-PHP\u INT\u max
array\u reduce($a,'max')
即使对于空数组也有效,在这种情况下,它将返回
null
。我们有点离题了。:-)@Keith如果这样做,我不妨直接使用PHP的
max()是的,我还不完全清楚-我的
max()
是一个双参数函数,其行为类似于内置的
max()
对两个参数的行为。应该更准确些。
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');