разрешить пользовательским функциям принимать списки аргументов переменной длины.

ько что узнал, что есть функция под названиемfunc_get_arg в PHP, который позволяет разработчику использовать вариант стиля получения аргументов. Это кажется очень полезным, потому что количество аргументов теперь может быть произвольным, но я не могу придумать ни одного хорошего примера его использования.

Каковы некоторые примеры использования этой функции, чтобы полностью использовать ее полиморфную характеристику?

 mario11 мар. 2011 г., 02:49
sprintf а такжеmax Хорошие примеры функций, которые могут иметь дело с произвольным числом аргументов. Обычно вы хотите использовать его с единообразными параметрами.
 Keith Gaughan11 мар. 2011 г., 02:52
Вы не имеете в виду «полиморфный»: термин, который вы ищете, «вариадный»:en.wikipedia.org/wiki/Variadic_function
 drudge11 мар. 2011 г., 02:42
us2.php.net/manual/en/function.func-get-arg.php Прокрутите вниз доExamplesзатем прочитайтеUser Contributed Notes

Ответы на вопрос(7)

Решение Вопроса

func_get_args() который проще использовать, если требуется несколько аргументов.

Например, чтобы воссоздать PHPmax().

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.

 Keith Gaughan11 мар. 2011 г., 02:49
Вы знаете, вы можете уменьшить, если вы простите каламбур, что доarray_reduce(func_get_args(), 'max'), и это будет работать с отрицательными числами тоже.
 alex11 мар. 2011 г., 03:00
@Keith Если я это сделаю, я также могу использовать PHPmax() непосредственно. :П
 Keith Gaughan11 мар. 2011 г., 02:58
Единственная проблема в том, что если вам не дают аргументов, ответ-PHP_INT_MAX. array_reduce($a, 'max') будет работать даже для пустого массива, в этом случае он вернетnull, Мы получаем немного не по теме здесь. :-)
 alex11 мар. 2011 г., 02:53
@ Кейт Может быть, я должен был сделать этот начальный номер-PHP_INT_MAX.
 Keith Gaughan11 мар. 2011 г., 03:02
Да, я не совсем понял, мойmax() подразумевается, что это функция с двумя аргументами, которая ведет себя как встроеннаяmax() делает для двух аргументов. Должен был быть более точным там.

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);
?>

вы используете термин «полиморфизм» совершенно неправильно. Полиморфизм - это концепция объектно-ориентированного программирования, и он не имеет ничего общего с переменным числом аргументов в функциях.

По моему опыту, все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);

Начиная с php5.6, нет ни одного случая использованияfunc_get_arg больше; что не означает, что его функциональность больше не нужна, но заменяетсяпеременная функция с помощью... синтаксис:

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

Это особенно полезно, если есть методы, которые перегружены в конце; нужно отфильтровать первые аргументы больше, как показанопример:

Старый стиль с использованием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 выдают один и тот же результат, один гораздо проще написать.

что есть хороший вариант использования этого внутри нормальной функции. Как любитель контроля, мне нравится точно знать, что передаётся моим функциям, и мне нравится точно знать, что я передаю.

Однако его можно использовать полностью для таких вещей, как динамическая / статическая маршрутизация URL. Когда вы переписываете (через mod_rewrite) URL-адрес аргументов для одной начальной загрузки.

В этом смысле вы можете иметь аргументы, которые не обязательно должны существовать при каждом запросе страницы.

Я почти никогда не используюfunc_get_arg()но я использую свою кузинуfunc_get_args() немного. Вот один пример, функция в соответствии сecho Утверждение, что сущность кодирует все свои аргументы:

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

Я использую эту функцию совсем немного.

Вот еще один полезный пример, функция, которая выполняет ту же работу, что и SQLCOALESCE() функция.

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

Возвращает первый ненулевой аргумент, переданный в, илиnull если нет такого аргумента.

 Keith Gaughan11 мар. 2011 г., 02:51
Сила привычки - я пишу код на PHP с тех пор, как появился PHP 4.0.
 alex11 мар. 2011 г., 02:45

у нас есть несколько массивов, содержащих данные, в которых нам нужно искать по ключам их значения без объединения этих массивов.

Массивы похожи на:

$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).

Ваш ответ на вопрос