Func get args: примеры (PHP)
func_get_args: arrayФункция func_get_args() возвращает массив, содержащий все аргументы, переданные в текущую пользовательскую функцию. Эта функция не имеет параметров и доступна только внутри области видимости функции.
Функция используется, когда необходимо работать с переменным числом аргументов без явного объявления параметров в сигнатуре функции. Это полезно при создании функций-обёрток, логирования, обработчиков событий или реализации функций с переменным количеством параметров.
Важное ограничение: функция не может использоваться в качестве параметра по умолчанию при объявлении функции. Также она зависит от порядка вызова и работает только внутри пользовательских функций.
function sum() {
$args = func_get_args();
return array_sum($args);
}
echo sum(1, 2, 3, 4, 5);15
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
)func_num_args() - возвращает количество переданных аргументов. Полезна, когда нужно только количество без самих значений.
func_get_arg($index) - получает конкретный аргумент по индексу. Удобна для выборочного доступа к параметрам.
Оператор ... (spread) в PHP 5.6+ позволяет собирать аргументы в массив напрямую в объявлении функции. Этот способ предпочтительнее в новых версиях PHP из-за лучшей читаемости и поддержки типизации.
func_get_args() подходит для legacy-кода и случаев, когда нужно поддерживать старые версии PHP. Оператор ... рекомендуется для новых проектов на PHP 5.6 и выше, так как обеспечивает явное объявление параметра и возможность указания типа.
def example_func(*args):
print(f"Получено {len(args)} аргументов")
return sum(args)
print(example_func(1, 2, 3, 4))Получено 4 аргументов 10
// Старый способ (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 нет прямой аналогии, но переменное количество параметров можно эмулировать через передачу строки с разделителями или использование временных таблиц.
// Вызов в глобальной области видимости
$args = func_get_args();
print_r($args);Fatal error: Uncaught Error: func_get_args(): Cannot be called from the global scope
function incorrect($param = func_get_args()) {
// ...
}Fatal error: func_get_args(): Cannot be used as a parameter
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 8.0 функция func_get_args() продолжает работать, но её использование сокращается в пользу оператора ... (spread operator).
Важное изменение в PHP 8: улучшена обработка аргументов в сочетании с именованными параметрами. func_get_args() корректно работает с именованными параметрами, сохраняя порядок их передачи.
В PHP 8.1 не было существенных изменений в работе функции, но рекомендуется использовать современные альтернативы для нового кода.
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
)
15class 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
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
)
)
)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
)