Func get arg: примеры (PHP)
func_get_arg(int $position): mixedОписание функции func_get_arg()
Функция func_get_arg() является встроенной функцией PHP, которая позволяет получить значение конкретного аргумента, переданного в пользовательскую функцию, по его порядковому номеру (индексу). Она используется внутри тела функции для доступа к её параметрам в случаях, когда функция объявлена без явного указания всех ожидаемых аргументов, или для создания функций с переменным числом параметров.
Функция принимает один обязательный параметр:
- $position (int) — целочисленный индекс (номер) запрашиваемого аргумента. Нумерация аргументов начинается с нуля.
Функция должна вызываться только внутри тела пользовательской функции. Попытка вызова вне её контекста приведёт к ошибке.
Простые примеры использования
Пример функции, которая выводит значение второго переданного аргумента.
<?php
function showSecondArg() {
// Получаем значение аргумента с индексом 1 (второй аргумент)
$second = func_get_arg(1);
echo "Второй аргумент: ". $second;
}
showSecondArg('Яблоко', 'Груша', 'Вишня');
?>Второй аргумент: Груша
Перебор всех переданных аргументов.
<?php
function listAllArgs() {
$count = func_num_args();
for ($i = 0; $i < $count; $i++) {
echo "Аргумент #$i: ". func_get_arg($i) . "\n";
}
}
listAllArgs('Красный', 'Зеленый', 'Синий');
?>Аргумент #0: Красный Аргумент #1: Зеленый Аргумент #2: Синий
Похожие функции в PHP
- func_get_args() — возвращает массив, содержащий все аргументы, переданные функции. Удобна, когда нужно работать со всеми аргументами как с массивом, например, для передачи в другую функцию с помощью оператора распаковки
.... - func_num_args() — возвращает количество аргументов, переданных функции. Часто используется в паре с
func_get_arg()илиfunc_get_args(). - ... (spread/rest operator) — начиная с PHP 5.6, можно объявить функцию с переменным числом параметров, используя оператор
...(function sum(...$numbers)). Все аргументы автоматически попадают в массив$numbers. Этот способ является современной и предпочтительной альтернативой, так как делает код чище и безопаснее.
Функции func_get_arg() и func_num_args() стоит использовать в основном для поддержки старого кода или в редких случаях, когда нужно получить именно один аргумент по индексу без создания массива всех аргументов.
Аналоги в других языках программирования
В Python используется специальный синтаксис *args для получения всех позиционных аргументов в виде кортежа.
def example_func(*args):
print(f"Первый аргумент: {args[0]}" if args else "Нет аргументов")
print(f"Все аргументы: {args}")
example_func(10, 20, 30)Первый аргумент: 10 Все аргументы: (10, 20, 30)
В JavaScript (в обычных функциях, не стрелочных) доступен подобный массиву объект arguments, содержащий все переданные аргументы.
function exampleFunc() {
console.log("Третий аргумент:", arguments[2]);
console.log("Количество:", arguments.length);
}
exampleFunc("a", "b", "c", "d");Третий аргумент: c Количество: 4
В MySQL хранимые процедуры требуют явного объявления всех входных параметров. Функции для работы с переменным числом аргументов отсутствуют.
Типичные ошибки при использовании
<?php
// Ошибочный вызов напрямую в глобальной области видимости
$arg = func_get_arg(0);
?>Warning: func_get_arg() must be called from a function context in ...
<?php
function test() {
// Функция вызвана без аргументов, индекс 0 не существует
echo func_get_arg(0);
}
test();
?>Warning: func_get_arg(): Argument 0 not passed to function in ...
<?php
function test() {
// Индекс должен быть integer
echo func_get_arg('first');
}
test('value');
?>Warning: func_get_arg() expects parameter 1 to be int, string given in ...
Изменения в последних версиях PHP
Специфика работы функции func_get_arg() существенно не менялась в последних основных версиях PHP. Однако, начиная с PHP 8.0, в рамках общего повышения производительности движка Zend Engine, все функции семейства func_* могут работать несколько быстрее.
Важным контекстным изменением в PHP 8.0 стало изменение поведения при передаче неверного количества аргументов в пользовательскую функцию. Если раньше это вызывало предупреждение, то теперь в большинстве случаев генерируется фатальная ошибка ArgumentCountError. Это не затрагивает прямой вызов func_get_arg(), но влияет на общую логику работы с аргументами.
Рекомендуется использовать оператор ..., который был введен в PHP 5.6 и стабильно работает во всех современных версиях.
Расширенные примеры применения
<?php
function debugLog() {
$timestamp = date('Y-m-d H:i:s');
$argsCount = func_num_args();
$message = "[$timestamp] ";
for ($i = 0; $i < $argsCount; $i++) {
$message .= func_get_arg($i) . ' ';
}
file_put_contents('debug.log', $message . PHP_EOL, FILE_APPEND);
}
debugLog('Пользователь', 'id=15', 'вошел в систему');
?>// Содержимое файла debug.log: // [2023-10-26 14:30:01] Пользователь id=15 вошел в систему
<?php
function sumIntegers() {
$total = 0;
for ($i = 0; $i < func_num_args(); $i++) {
$arg = func_get_arg($i);
if (is_int($arg)) {
$total += $arg;
}
}
return $total;
}
$result = sumIntegers(5, 'строка', 10, 3.5, 2);
echo "Сумма целых чисел: $result"; // 5 + 10 + 2
?>Сумма целых чисел: 17
<?php
function recursiveWrapper() {
static $depth = 0;
$depth++;
echo "Глубина вызова: $depth. Первый аргумент этого уровня: ";
// Внимание: func_get_arg(0) получит аргумент текущего вызова функции
echo func_get_arg(0) ?? 'NULL' . "\n";
if ($depth < 3) {
recursiveWrapper('Вложенный');
}
$depth--;
}
recursiveWrapper('Основной');
?>Глубина вызова: 1. Первый аргумент этого уровня: Основной Глубина вызова: 2. Первый аргумент этого уровня: Вложенный Глубина вызова: 3. Первый аргумент этого уровня: Вложенный