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

Руководство по func_num_args с практическими примерами
Раздел: Функции/аргументы
func_num_args: int
Основные сведения о func_num_args

Функция func_num_args() в PHP возвращает количество аргументов, переданных в пользовательскую функцию. Эта функция применяется для создания функций с переменным числом параметров до появления оператора ... в PHP 5.6.

Функция не принимает никаких аргументов и вызывается только внутри тела пользовательской функции. Её результат — целое число, соответствующее количеству фактически переданных аргументов при вызове родительской функции.

Принцип работы

func_num_args() работает исключительно в области видимости пользовательской функции. Попытка вызова вне функции приведет к ошибке.

Простые примеры использования
Базовый подсчет аргументов
<?php
function exampleFunction() {
    return func_num_args();
}

echo exampleFunction(1, 2, 3); // 3
echo exampleFunction('a');      // 1
echo exampleFunction();         // 0
?>
3
1
0
Использование с другими функциями для аргументов
<?php
function sum() {
    $count = func_num_args();
    if ($count === 0) return 0;
    
    $args = func_get_args();
    return array_sum($args);
}

echo sum(10, 20, 30); // 60
echo sum(5);          // 5
echo sum();           // 0
?>
60
5
0
Похожие функции в PHP

func_get_args() — возвращает массив всех переданных аргументов. Часто используется вместе с func_num_args().

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

Оператор ... (спред) (с PHP 5.6) — современный способ объявления функций с переменным числом аргументов. Предпочтительнее использовать его, так как он обеспечивает лучшую читаемость и типизацию.

<?php
// Современный способ с ...
function modernSum(...$numbers) {
    return array_sum($numbers);
}
?>
Аналоги в других языках

Func num args в Javascript

Используется свойство arguments.length внутри функции (в устаревшем коде) или rest-параметры.

function exampleJS() {
    return arguments.length;
}
console.log(exampleJS(1, 2, 3)); // 3

// Современный вариант
function modernJS(...args) {
    return args.length;
}
3

Func num args в Python

Используется *args для получения переменного числа аргументов.

def example_python(*args):
    return len(args)

print(example_python(1, 2, 3)) # 3
3

Func num args в MySQL

Нет прямой аналогии, так в хранимых процедурах количество параметров фиксировано.

Распространенные ошибки
Вызов вне функции
<?php
$result = func_num_args(); // Ошибка
?>
Fatal error: Uncaught Error: Call to undefined function func_num_args()
Неверное использование с именованными параметрами
<?php
function test($a, $b) {
    return func_num_args();
}

echo test(b: 2, a: 1); // В PHP 8 с именованными аргументами
?>
2

Функция считает общее количество переданных аргументов, независимо от их имен.

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

В PHP 5.6 и выше появился оператор ..., который стал предпочтительным способом работы с переменным числом аргументов.

В PHP 8.0 улучшена обработка именованных аргументов — func_num_args() корректно работает с ними, возвращая общее количество фактически переданных аргументов.

Функция остается неизменной в своей основе, так как является частью старого API для работы с аргументами.

Расширенные примеры
Динамическое создание объектов
Пример php
<?php
function createInstance($className) {
    $argCount = func_num_args();
    $args = func_get_args();
    
    if ($argCount === 1) {
        return new $className();
    }
    
    array_shift($args); // Удаляем имя класса
    $reflection = new ReflectionClass($className);
    return $reflection->newInstanceArgs($args);
}

class Test {
    public function __construct($a = null, $b = null) {
        echo "Создан с: $a, $b";
    }
}

$obj1 = createInstance('Test');
$obj2 = createInstance('Test', 'первый', 'второй');
?>
Создан с: , 
Создан с: первый, второй
Валидация минимального количества аргументов
Пример php
<?php
function validateArgs($minRequired) {
    $passed = func_num_args() - 1; // -1 исключает первый параметр
    if ($passed < $minRequired) {
        throw new Exception("Требуется $minRequired аргументов, передано $passed");
    }
    return true;
}

// Использование
validateArgs(3, 'a', 'b'); // Выбросит исключение
?>
Exception: Требуется 3 аргументов, передано 2
Совместимость со старым кодом
Пример php
<?php
// Функция-обертка для обратной совместимости
function legacyWrapper() {
    $count = func_num_args();
    $args = func_get_args();
    
    if ($count === 1 && is_array($args[0])) {
        // Новый стиль вызова с массивом
        return processArray($args[0]);
    }
    // Старый стиль с перечислением
    return processArray($args);
}

function processArray($items) {
    return implode(', ', $items);
}

echo legacyWrapper('a', 'b', 'c'); // a, b, c
echo legacyWrapper(['x', 'y', 'z']); // x, y, z
?>
a, b, cx, y, z

PHP func_num_args function comments

En
Func num args Returns the number of arguments passed to the function