В чем разница между этими двумя фрагментами кода соответственно на PHP?:
function eat_apple($apple)
{
return true;
}
А также:
function eat_apple()
{
$apple = func_get_arg(0);
return true;
}
Или есть разница? Если нет, то в чем смысл func_get_arg()? Наверняка это служит какой-то цели, о которой я не знаю?
возможный дубликат Различие в поведении func_num_args, func_get_arg и func_get_args от php 5.2 до 5.3 Saurabh Gokhale 03.06.2011
Это связано с различиями между разными версиями серии функций func_get_arg(). К моему вопросу не относится. delaccount992 03.06.2011
Разве это не очевидно, если посмотреть на сигнатуру функции? Первый говорит правду. Другой лжет. Кроме того, причина использования func_get_arg указана в PHP. Руководство, которое вы должны проверить, прежде чем задавать вопросы: *разрешить определяемым пользователем функциям принимать списки аргументов переменной длины. * Gordon 03.06.2011
По правде говоря, особой разницы нет, и стандартный передаваемый аргумент обычно предпочтительнее, чем func_get_arg().
Есть два случая, когда вы можете захотеть использовать func_get_arg() вместо использования определенных аргументов:
Если вы хотите иметь неограниченное количество аргументов. Как правило, это лучше сделать с одним аргументом-массивом, но бывают случаи, когда вы можете захотеть разрешить неограниченное количество аргументов. Реальным примером функции, которая работает таким образом, является встроенная в PHP функция printf.
Если у вас есть сложная функция, в которой количество переданных аргументов может изменить то, для чего используются аргументы и/или их тип данных. Например, передача одного аргумента может привести к тому, что функция ожидает строку, тогда как передача двух аргументов может сначала ожидать целое число, а затем строку. Я не могу придумать никаких примеров этого навскидку, но я уверен, что они есть. Обычно я бы сказал, что такое поведение является плохой практикой, но я вижу, как это может быть полезно для добавления функций при сохранении обратной совместимости.
Есть две вещи, которые вы точно потеряете, если будете использовать fung_get_arg() вместо стандартных аргументов функции:
Возможность пройти по ссылке.
Возможность для вашей IDE делать любые подсказки типов или автозаполнение.
Ответ 4 · Rakesh Sankar
Другая возможная причина, о которой я мог подумать, - это предотвращение фатальной ошибки.
<?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) и т. д.
Ответ 5 · Itay Moav -Malimovka
Некоторые причины
Вы можете использовать эту магию для эмуляции перегрузки
Вы можете написать функцию (например, 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());
}