В чем разница между func_get_arg () и - PullRequest
1 голос
/ 03 июня 2011

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

function eat_apple($apple)
{
    return true;
}

И:

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

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

Ответы [ 5 ]

7 голосов
/ 03 июня 2011

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

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

1 голос
/ 03 июня 2011

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

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

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

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

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

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

1 голос
/ 03 июня 2011

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

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

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

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

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

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

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

0 голосов
/ 03 июня 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());
}
0 голосов
/ 03 июня 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) и т. Д.

...