Func get arg: примеры (PHP)

Использование 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('Яблоко', 'Груша', 'Вишня');
?>
Второй аргумент: Груша
Использование в цикле с func_num_args()

Перебор всех переданных аргументов.

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

В 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

В JavaScript (в обычных функциях, не стрелочных) доступен подобный массиву объект arguments, содержащий все переданные аргументы.

function exampleFunc() {
    console.log("Третий аргумент:", arguments[2]);
    console.log("Количество:", arguments.length);
}

exampleFunc("a", "b", "c", "d");
Третий аргумент: c
Количество: 4
MySQL: Отсутствие прямого аналога

В 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
<?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
<?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
<?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. Первый аргумент этого уровня: Вложенный

PHP func_get_arg function comments

En
Func get arg Return an item from the argument list