В чем разница между func_get_arg() и

В чем разница между этими двумя фрагментами кода соответственно на PHP?:

function eat_apple($apple)
{
    return true;
}

А также:

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

Или есть разница? Если нет, то в чем смысл func_get_arg()? Наверняка это служит какой-то цели, о которой я не знаю?


person delaccount992    schedule 03.06.2011    source источник
comment
возможный дубликат Различие в поведении func_num_args, func_get_arg и func_get_args от php 5.2 до 5.3   -  person Saurabh Gokhale    schedule 03.06.2011
comment
Это связано с различиями между разными версиями серии функций func_get_arg(). К моему вопросу не относится.   -  person delaccount992    schedule 03.06.2011
comment
Разве это не очевидно, если посмотреть на сигнатуру функции? Первый говорит правду. Другой лжет. Кроме того, причина использования func_get_arg указана в PHP. Руководство, которое вы должны проверить, прежде чем задавать вопросы: *разрешить определяемым пользователем функциям принимать списки аргументов переменной длины. *   -  person Gordon    schedule 03.06.2011


Ответы (5)


func_get_argfunc_get_args) позволяют иметь функции с переменным числом параметров. , так называемые вариативные функции.

Возьмем в качестве примера array_merge, который принимает переменное количество массивов. объединены.

person Felix Kling    schedule 03.06.2011
comment
Ах. Итак, если передано более одного аргумента, нужно будет использовать func_get_arg? - person delaccount992; 03.06.2011
comment
Не обязательно, потому что вы также можете определить функцию с аргументами со значениями по умолчанию, что также позволяет вам иметь переменное количество аргументов. - person Spudley; 03.06.2011
comment
@Kobie: Нет, если ваша функция принимает два параметра, вы можете определить ее как function foo($a, $b). Я имею в виду, если функция принимает переменное количество параметров, когда количество параметров неизвестно во время компиляции. - person Felix Kling; 03.06.2011
comment
@Felix - все еще не обязательно: если вы не знали, что $a или $b будут переданы, вы можете определить для них значения по умолчанию и по-прежнему определять их как обычные: function($a=NULL, $b=NULL). func_get_args() только на самом деле нужно вступать в игру, если вы мыслите с точки зрения неограниченного количества аргументов, согласно printf(). - person Spudley; 03.06.2011

Привет. В чем разница между этими двумя фрагментами кода соответственно на PHP?:

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

в чем смысл func_get_arg()? Наверняка это служит какой-то цели, о которой я не знаю?

Официально заявленная цель:

Возврат элемента из списка аргументов

-- http://php.net/func-get-arg

person salathe    schedule 03.06.2011

По правде говоря, особой разницы нет, и стандартный передаваемый аргумент обычно предпочтительнее, чем func_get_arg().

Есть два случая, когда вы можете захотеть использовать func_get_arg() вместо использования определенных аргументов:

  1. Если вы хотите иметь неограниченное количество аргументов. Как правило, это лучше сделать с одним аргументом-массивом, но бывают случаи, когда вы можете захотеть разрешить неограниченное количество аргументов. Реальным примером функции, которая работает таким образом, является встроенная в PHP функция printf.

  2. Если у вас есть сложная функция, в которой количество переданных аргументов может изменить то, для чего используются аргументы и/или их тип данных. Например, передача одного аргумента может привести к тому, что функция ожидает строку, тогда как передача двух аргументов может сначала ожидать целое число, а затем строку. Я не могу придумать никаких примеров этого навскидку, но я уверен, что они есть. Обычно я бы сказал, что такое поведение является плохой практикой, но я вижу, как это может быть полезно для добавления функций при сохранении обратной совместимости.

Есть две вещи, которые вы точно потеряете, если будете использовать fung_get_arg() вместо стандартных аргументов функции:

  1. Возможность пройти по ссылке.

  2. Возможность для вашей IDE делать любые подсказки типов или автозаполнение.

person Spudley    schedule 03.06.2011

Другая возможная причина, о которой я мог подумать, - это предотвращение фатальной ошибки.

У вас есть функция:

<?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) и т. д.

person Rakesh Sankar    schedule 03.06.2011
comment
для этого не требуется func_get_args(), потому что вы можете определить значения по умолчанию для аргументов: function disaply($a='', $b='', $c=''). Не выдаст ошибку, если вы передадите только один или два аргумента. - person Spudley; 03.06.2011
comment
Да, я согласен, но для тех, кто не использует дефолт, это помогает. Согласен? - person Rakesh Sankar; 03.06.2011
comment
Если вы не хотите использовать значения по умолчанию, то да, это поможет. Но почему бы вам не использовать значения по умолчанию? Единственная причина, о которой я могу думать, - это если вы намереваетесь разрешить неизвестное количество аргументов, но причин для этого немного и далеко друг от друга. - person Spudley; 03.06.2011
comment
Ах да, первая возможная причина. - person Rakesh Sankar; 03.06.2011

Некоторые причины:

  1. Вы можете использовать эту магию для эмуляции перегрузки
  2. Вы можете написать функцию (например, 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());
}
person Itay Moav -Malimovka    schedule 03.06.2011