Получение аргументов в php

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" ;
>
>

Результат выполнения данного примера:

Количество аргументов: 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 ;
>

$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.
*/

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» ;
>
>

Результат выполнения данного примера:

Количество аргументов: 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 ;
>

$arg = ‘bar’ ;
byVal ( $arg );
byRef ( $arg );
?>

Результат выполнения данного примера:

Передан : array (
0 => ‘bar’,
)
После изменения : array (
0 => ‘bar’,
)
Передан : array (
0 => ‘bar’,
)
После изменения : array (
0 => ‘baz’,
)

Примечания

Замечание:

Так как для определения параметров данной функции необходим контекст выполнения, она не может быть передана в качестве параметра в версиях PHP до 5.3.0. Если функцию все же необходимо передать, то нужно присвоить ее переменной, которую уже можно использовать при передаче.

Замечание:

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

Замечание: Эта функция возвращает только копии переданных аргументов, и не возвращает значения по умолчанию (непереданных) аргументов.

Смотрите также

Источник

Читайте также:  Зарплата middle php программиста
Оцените статью