Func num args: примеры (PHP)
func_num_args: intФункция 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
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)) # 33
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 5.6 и выше появился оператор ..., который стал предпочтительным способом работы с переменным числом аргументов.
В PHP 8.0 улучшена обработка именованных аргументов — func_num_args() корректно работает с ними, возвращая общее количество фактически переданных аргументов.
Функция остается неизменной в своей основе, так как является частью старого API для работы с аргументами.
<?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
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
// Функция-обертка для обратной совместимости
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