func_get_args
Эта функция может быть использована совместно с func_num_args() и func_get_arg() для создания функций с переменным количеством аргументов.
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает массив, в котором каждый элемент является копией соответствующего члена списка аргументов пользовательской функции.
Ошибки
Генерирует предупреждение при вызове вне определения функции.
Примеры
Пример #1 Пример использования func_get_args()
function foo ()
$numargs = func_num_args ();
echo «Количество аргументов: $numargs \n» ;
if ( $numargs >= 2 ) echo «Второй аргумент: » . func_get_arg ( 1 ) . «\n» ;
>
$arg_list = func_get_args ();
for ( $i = 0 ; $i < $numargs ; $i ++) echo "Аргумент № $i : " . $arg_list [ $i ] . "\n" ;
>
>
?php
Результат выполнения данного примера:
Количество аргументов: 3 Второй аргумент: 2 Аргумент №0: 1 Аргумент №1: 2 Аргумент №2: 3
Пример #2 Пример передачи аргументов по ссылке и по значению с func_get_args()
function byVal ( $arg ) echo ‘Передан : ‘ , var_export ( func_get_args ()), PHP_EOL ;
$arg = ‘baz’ ;
echo ‘После изменения : ‘ , var_export ( func_get_args ()), PHP_EOL ;
>
?php
$arg = ‘bar’ ;
byVal ( $arg );
byRef ( $arg );
?>
Результат выполнения данного примера:
Передан : array (
0 => ‘bar’,
)
После изменения : array (
0 => ‘baz’,
)
Передан : array (
0 => ‘bar’,
)
После изменения : array (
0 => ‘baz’,
)
Примечания
Замечание:
Начиная с PHP 8.0.0, семейство функций func_*() предназначено для большей прозрачности в отношении именованных аргументов, обрабатывая аргументы так, как если бы все они были переданы позиционно, а отсутствующие аргументы заменяются их значениями по умолчанию. Функция игнорирует набор неизвестных именованных вариативных аргументов. К собранным неизвестным именованным аргументам можно получить доступ только через вариативный параметр.
Замечание:
Если аргументы были переданы по ссылке, то все изменения аргументов будут отражены на возвращаемых функцией значениях. В PHP 7 также будут возвращены текущие значения, если аргументы переданы по значению
Замечание: Эта функция возвращает только копии переданных аргументов, и не возвращает значения по умолчанию (непереданных) аргументов.
Смотрите также
User Contributed Notes 11 notes
Simple function to calculate average value using dynamic arguments:
function average () return array_sum ( func_get_args ())/ func_num_args ();
>
print average ( 10 , 15 , 20 , 25 ); // 17.5
?>
If you want to get the arguments by reference, instead of func_get_args() you can simply use
function args_byref (&. $args ) // Modify the $args array here
>
?>
Credits should go to Markus Malkusch for pointing this out on Stackoverflow.
https://stackoverflow.com/a/29181826/1426064
How to create a polymorphic/»overloaded» function
function select ()
$t = » ;
$args = func_get_args ();
foreach ( $args as & $a ) $t .= gettype ( $a ) . ‘|’ ;
$a = mysql_real_escape_string ( $a );
>
if ( $t != » ) $t = substr ( $t , 0 , — 1 );
>
$sql = » ;
switch ( $t ) case ‘integer’ :
// search by ID
$sql = «id = < $args [ 0 ]>» ;
break;
case ‘string’ :
// search by name
$sql = «name LIKE ‘% < $args [ 0 ]>%'» ;
break;
case ‘string|integer’ :
// search by name AND status
$sql = «name LIKE ‘% < $args [ 0 ]>%’ AND status = < $args [ 1 ]>» ;
break;
case ‘string|integer|integer’ :
// search by name with limit
$sql = «name LIKE ‘% < $args [ 0 ]>%’ LIMIT < $args [ 1 ]>, < $args [ 2 ]>» ;
break;
default:
// 😛
$sql = ‘1 = 2’ ;
>
return mysql_query ( ‘SELECT * FROM table WHERE ‘ . $sql );
>
$res = select ( 29 ); // by ID
$res = select ( ‘Anderson’ ); // by name
$res = select ( ‘Anderson’ , 1 ); // by name and status
$res = select ( ‘Anderson’ , 0 , 5 ); // by name with limit
?>
Merge func_get_args() with function defaults
class utils /**
* @param mixed[] $args
* @param ReflectionMethod $reflectionMethod
*
* @return array
*/
public static function mergeArgsWithDefaults ( $args , \ ReflectionMethod $reflectionMethod ) foreach ( array_slice ( $reflectionMethod -> getParameters (), count ( $args ) ) as $param ) /**
* @var ReflectionParameter $param
*/
$args [] = $param -> getDefaultValue ();
>
return $args ;
>
>
class sampleParent const USER_FILE_TYPE_FILE = ‘FILE’ ;
public function select ( $idUserFile = null , $idUserFileType = self :: USER_FILE_TYPE_FILE ) echo ‘[$idUserFile=>’ . $idUserFile . ‘, $idUserFileType=>’ . $idUserFileType , ‘]‘ . PHP_EOL ;
>
>
class sample extends sampleParent const USER_FILE_TYPE_IMG = ‘IMG’ ;
public function select ( $idUserFile = null , $idUserFileType = self :: USER_FILE_TYPE_IMG ) return call_user_func_array ( ‘parent::select’ , \ utils :: mergeArgsWithDefaults ( func_get_args (), new ReflectionMethod ( __CLASS__ , __FUNCTION__ ) ) );
>
>
$sample1 = new sampleParent ();
$sample1 -> select (); //Prints «» / self::USER_FILE_TYPE_FILE
$sample1 -> select ( 1 ); //Prints 1 / self::USER_FILE_TYPE_FILE
$sample1 -> select ( 2 , ‘test 1’ ); //Prints 2 / «test 1»
echo ‘
‘ . PHP_EOL ;
$sample2 = new sample ();
$sample2 -> select (); //Prints «» / self::USER_FILE_TYPE_IMG
$sample2 -> select ( 3 ); //Prints 3 / self::USER_FILE_TYPE_IMG
$sample2 -> select ( 4 , ‘test 2’ ); //Prints 4 / «test 2»
?>
please note that optional parameters are not seen/passed by func_get_args(), as well as func_get_arg().
function testfunc ( $optional = ‘this argument is optional..’ ) <
$args = func_get_args ();
var_dump ( $args );
echo $optional ;
>
?>
test case #1:
testfunc(‘argument no longer optional..’);
result for #1:
array(1) <
[0]=> string(20) «argument no longer optional..»
>
argument no longer optional..
test case #2:
testfunc(‘argument no longer optional..’,’this is an extra argument’);
result for #2:
array(2) <
[0]=> string(29) «argument no longer optional..»
[1]=> string(25) «this is an extra argument»
>
argument no longer optional..
test case #3: — RESULTS IN AN EMPTY ARRAY
testfunc();
result for #3:
array(0) <
>
this argument is optional..
// Turns the array returned by func_get_args() into an array of name/value
// pairs that can be processed by extract().
function varargs ( $args ) <
$count = count ( $args );
for ( $i = 0 ; $i < $count ; $i += 2 ) <
$result [ $args [ $i ]] = $args [ $i + 1 ];
>
// Do some magic.
extract ( varargs ( func_get_args ()));
echo nl2br ( «\n\$var1 = $var1 » );
echo nl2br ( «\n\$var2 = $var2 » );
echo nl2br ( «\n\$foo = $foo \n\n» );
// Modify some variables that were passed by reference.
// Note that func_get_args() doesn’t pass references, so they
// need to be explicitly declared in the function definition.
$ref1 = 42 ;
$ref2 = 84 ;
>
echo nl2br ( «Before calling test(): \$a = $a \n» );
echo nl2br ( «Before calling test(): \$b = $b \n» );
// Try removing the ‘foo, «bar»‘ from the following line.
test ( $a , $b , var1 , «abc» , var2 , «def» , foo , «bar» );
echo nl2br ( «After calling test(): \$a = $a \n» );
echo nl2br ( «After calling test(): \$b = $b \n» );
?>
/*
This example demonstrate how to use unknown variable arguments by reference.
func_get_args() don’t return arguments by reference, but
debug_backtrace() «args» is by reference.
In PHP 5 this have no particular sense, because calling with arguments by reference
is depreciated and produce warning.
*/
?php
function foo ( /*variable arguments*/ ) // func_get_args returns copy of arguments
// $args = func_get_args();
// debug_backtrace returns arguments by reference
$stack = debug_backtrace ();
$args = array();
if (isset( $stack [ 0 ][ «args» ]))
for( $i = 0 ; $i < count ( $stack [ 0 ][ "args" ]); $i ++)
$args [ $i ] = & $stack [ 0 ][ «args» ][ $i ];
call_user_func_array (array(& $this , ‘bar’ ), $args );
>
function bar ( $bar = NULL ) if (isset( $bar ))
$this -> bar = & $bar ;
>
>
$global_bar = «bar global» ;
$foo = & new foo ();
echo «foo->bar: » . $foo -> bar . «\n» ;
$foo -> bar = «new bar» ;
echo «global_bar: » . $global_bar . «\n» ;
/*
Result:
foo->bar: default bar
global_bar: bar global
*/
$foo = & new foo (& $global_bar );
echo «foo->bar: » . $foo -> bar . «\n» ;
$foo -> bar = «new bar» ;
echo «global_bar: » . $global_bar . «\n» ;
/*
Result:
foo->bar: bar global
global_bar: new bar
*/
The size of the array resulting from func_get_args(), for instance using count(), does not take into account parameters that have been assigned default values in the function definition.
function foo($bar=true) echo count(func_get_args());
>
A useful condition to test for when a function needs to return default behavior (whatever that might be) when no value is present and the value of $bar could be true, false, null, etc.
«Because this function depends on the current scope to determine parameter details, it cannot be used as a function parameter. If you must pass this value, assign the results to a variable, and pass the variable.»
This means that the following code generates an error:
function foo ( $list )
echo implode ( ‘, ‘ , $list );
>
function foo2 ()
foo ( func_get_args ());
>
?>
However, you can easily get around this by doing the following:
function foo ( $list )
echo implode ( ‘, ‘ , $list );
>
function foo2 ()
foo ( $args = func_get_args ());
>
?>
This captures the context from foo2(), making this legal. You get the expected output:
func_get_args
Эта функция может быть использована совместно с func_num_args() и func_get_arg() для создания функций с переменным количеством аргументов.
Возвращаемые значения
Возвращает массив, в котором каждый элемент является копией соответствующего члена списка аргументов пользовательской функции.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Эта функция теперь может быть использована в качестве параметра функции. |
5.3.0 | Если эта функция вызвана в глобальной области видимости файла, подключенного с помощью include или require из функции вызывающего файла, то теперь будет сгенерировано предупреждение и возвращено значение FALSE . |
Ошибки
Генерирует предупреждение при вызове вне определения функции.
Примеры
Пример #1 Пример использования func_get_args()
function foo ()
$numargs = func_num_args ();
echo «Количество аргументов: $numargs
\n» ;
if ( $numargs >= 2 ) echo «Второй аргумент: » . func_get_arg ( 1 ) . «
\n» ;
>
$arg_list = func_get_args ();
for ( $i = 0 ; $i < $numargs ; $i ++) echo "Аргумент № $i : " . $arg_list [ $i ] . "
\n» ;
>
>
?php
Результат выполнения данного примера:
Количество аргументов: 3
Второй аргумент: 2
Аргумент №0: 1
Аргумент №1: 2
Аргумент №2: 3
Пример #2 Использование func_get_args() до и после PHP 5.3
test.php
function foo () include ‘./fga.inc’ ;
>
foo ( ‘Первый аргумент’ , ‘Второй аргумент’ );
?>
fga.inc
$args = func_get_args ();
var_export ( $args );
array ( 0 => 'Первый аргумент', 1 => 'Второй аргумент', )
Warning: func_get_args(): Called from the global scope - no function context in /home/torben/Desktop/code/ml/fga.inc on line 3 false
Пример #3 Пример передачи аргументов по ссылке и по значению с func_get_args()
function byVal ( $arg ) echo ‘Передан : ‘ , var_export ( func_get_args ()), PHP_EOL ;
$arg = ‘baz’ ;
echo ‘После изменения : ‘ , var_export ( func_get_args ()), PHP_EOL ;
>
?php
$arg = ‘bar’ ;
byVal ( $arg );
byRef ( $arg );
?>
Результат выполнения данного примера:
Передан : array (
0 => ‘bar’,
)
После изменения : array (
0 => ‘bar’,
)
Передан : array (
0 => ‘bar’,
)
После изменения : array (
0 => ‘baz’,
)
Примечания
Замечание:
Так как для определения параметров данной функции необходим контекст выполнения, она не может быть передана в качестве параметра в версиях PHP до 5.3.0. Если функцию все же необходимо передать, то нужно присвоить ее переменной, которую уже можно использовать при передаче.
Замечание:
Если аргументы были переданы по ссылке, то все изменения аргументов будут отражены на возвращаемых функцией значениях.
Замечание: Эта функция возвращает только копии переданных аргументов, и не возвращает значения по умолчанию (непереданных) аргументов.