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

Использование func_get_args для работы с аргументами функций в PHP
Раздел: Функции/аргументы
func_get_args: array
Основные сведения о func_get_args

Функция func_get_args() возвращает массив, содержащий все аргументы, переданные в текущую пользовательскую функцию. Эта функция не имеет параметров и доступна только внутри области видимости функции.

Функция используется, когда необходимо работать с переменным числом аргументов без явного объявления параметров в сигнатуре функции. Это полезно при создании функций-обёрток, логирования, обработчиков событий или реализации функций с переменным количеством параметров.

Важное ограничение: функция не может использоваться в качестве параметра по умолчанию при объявлении функции. Также она зависит от порядка вызова и работает только внутри пользовательских функций.

Базовые примеры использования
Пример 1: Простое получение аргументов
function sum() {
    $args = func_get_args();
    return array_sum($args);
}

echo sum(1, 2, 3, 4, 5);
15
Пример 2: Работа с разными типами данных
function collectValues() {
    $args = func_get_args();
    echo 'Количество: ' . count($args) . '\n';
    print_r($args);
}

collectValues('text', 123, [1, 2, 3], 45.67);
Количество: 4
Array
(
    [0] => text
    [1] => 123
    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [3] => 45.67
)
Похожие функции в PHP

func_num_args() - возвращает количество переданных аргументов. Полезна, когда нужно только количество без самих значений.

func_get_arg($index) - получает конкретный аргумент по индексу. Удобна для выборочного доступа к параметрам.

Оператор ... (spread) в PHP 5.6+ позволяет собирать аргументы в массив напрямую в объявлении функции. Этот способ предпочтительнее в новых версиях PHP из-за лучшей читаемости и поддержки типизации.

Сравнение подходов

func_get_args() подходит для legacy-кода и случаев, когда нужно поддерживать старые версии PHP. Оператор ... рекомендуется для новых проектов на PHP 5.6 и выше, так как обеспечивает явное объявление параметра и возможность указания типа.

Аналоги в других языках
Python: *args
def example_func(*args):
    print(f"Получено {len(args)} аргументов")
    return sum(args)

print(example_func(1, 2, 3, 4))
Получено 4 аргументов
10
JavaScript: arguments и rest parameters
// Старый способ (arguments)
function oldWay() {
    let sum = 0;
    for(let i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

// Современный способ (rest parameters)
function newWay(...args) {
    return args.reduce((a, b) => a + b, 0);
}

console.log(oldWay(1, 2, 3));
console.log(newWay(1, 2, 3, 4));
6
10
MySQL: Хранимые процедуры

В MySQL нет прямой аналогии, но переменное количество параметров можно эмулировать через передачу строки с разделителями или использование временных таблиц.

Распространенные ошибки
Ошибка 1: Вызов вне функции
// Вызов в глобальной области видимости
$args = func_get_args();
print_r($args);
Fatal error: Uncaught Error: func_get_args(): Cannot be called from the global scope
Ошибка 2: Использование в параметрах по умолчанию
function incorrect($param = func_get_args()) {
    // ...
}
Fatal error: func_get_args(): Cannot be used as a parameter
Ошибка 3: Переопределение аргументов
function process($a, $b) {
    $a = 'changed';
    $args = func_get_args();
    print_r($args);
}

process('original', 'value');
Array
(
    [0] => original
    [1] => value
)

func_get_args() возвращает исходные значения аргументов, даже если они были изменены в функции.

Изменения в новых версиях PHP

В PHP 8.0 функция func_get_args() продолжает работать, но её использование сокращается в пользу оператора ... (spread operator).

Важное изменение в PHP 8: улучшена обработка аргументов в сочетании с именованными параметрами. func_get_args() корректно работает с именованными параметрами, сохраняя порядок их передачи.

В PHP 8.1 не было существенных изменений в работе функции, но рекомендуется использовать современные альтернативы для нового кода.

Расширенные примеры применения
Пример 1: Декоратор функции
Пример php
function logCalls($callback) {
    return function() use ($callback) {
        $args = func_get_args();
        echo "Вызов функции с аргументами: ";
        print_r($args);
        echo "\n";
        return call_user_func_array($callback, $args);
    };
}

$loggedSum = logCalls('array_sum');
echo $loggedSum(1, 2, 3, 4, 5);
Вызов функции с аргументами: Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
15
Пример 2: Динамический вызов методов
Пример php
class Calculator {
    public static function execute($operation) {
        $args = func_get_args();
        array_shift($args); // Удаляем первый аргумент (operation)
        
        switch($operation) {
            case 'sum':
                return array_sum($args);
            case 'multiply':
                return array_product($args);
            case 'average':
                return count($args) ? array_sum($args) / count($args) : 0;
        }
    }
}

echo Calculator::execute('sum', 10, 20, 30) . "\n";
echo Calculator::execute('average', 5, 10, 15) . "\n";
60
10
Пример 3: Работа с типами и валидация
Пример php
function validateNumbers() {
    $args = func_get_args();
    $invalid = [];
    
    foreach ($args as $index => $value) {
        if (!is_numeric($value)) {
            $invalid[] = [
                'position' => $index,
                'value' => $value,
                'type' => gettype($value)
            ];
        }
    }
    
    return [
        'valid' => count($args) - count($invalid),
        'invalid' => $invalid
    ];
}

$result = validateNumbers(1, '2', 3.5, 'text', [1,2], 10);
print_r($result);
Array
(
    [valid] => 4
    [invalid] => Array
        (
            [0] => Array
                (
                    [position] => 3
                    [value] => text
                    [type] => string
                )
            [1] => Array
                (
                    [position] => 4
                    [value] => Array
                        (
                            [0] => 1
                            [1] => 2
                        )
                    [type] => array
                )
        )
)
Пример 4: Рекурсивная обработка
Пример php
function deepMerge() {
    $arrays = func_get_args();
    $result = [];
    
    foreach ($arrays as $array) {
        if (!is_array($array)) continue;
        foreach ($array as $key => $value) {
            if (is_array($value) && isset($result[$key]) && is_array($result[$key])) {
                $result[$key] = call_user_func_array(__FUNCTION__, [$result[$key], $value]);
            } else {
                $result[$key] = $value;
            }
        }
    }
    
    return $result;
}

$array1 = ['a' => 1, 'b' => ['x' => 10]];
$array2 = ['b' => ['y' => 20], 'c' => 3];
$array3 = ['b' => ['z' => 30]];

$merged = deepMerge($array1, $array2, $array3);
print_r($merged);
Array
(
    [a] => 1
    [b] => Array
        (
            [x] => 10
            [y] => 20
            [z] => 30
        )
    [c] => 3
)

PHP func_get_args function comments

En
Func get args Returns an array comprising a function's argument list