func_get_arg
(PHP 4, PHP 5, PHP 7)
func_get_arg — Возвращает элемент из списка аргументов
Описание
Возвращает указанный аргумент из списка аргументов пользовательской функции.
Эта функция может быть использована совместно с func_get_args() и func_num_args() для создания функций с переменным количеством аргументов.
Список параметров
-
arg_num
-
Номер аргумента. Аргументы функции считаются с нуля.
Возвращаемые значения
Возвращает указанный аргумент, или FALSE
в случае ошибки.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Эта функция теперь может быть использована в качестве параметра функции. |
5.3.0 |
Если эта функция вызвана в глобальной области видимости файла,
подключенного с помощью include
или require из функции вызывающего файла,
то теперь будет сгенерировано предупреждение и возвращено
значение FALSE .
|
Ошибки
Генерирует предупреждение при вызове вне определения функции, или
если arg_num
больше реально переданного
количества аргументов.
Примеры
Пример #1 Пример использования func_get_arg()
<?php
function foo()
{
$numargs = func_num_args();
echo "Количество аргументов: $numargs<br />\n";
if ($numargs >= 2) {
echo "Второй аргумент: " . func_get_arg(1) . "<br />\n";
}
}
foo (1, 2, 3);
?>
Пример #2 Использование func_get_arg() до и после PHP 5.3
test.php
<?php
function foo() {
include './fga.inc';
}
foo('Первый аргумент', 'Второй аргумент');
?>
fga.inc
<?php
$arg = func_get_arg(1);
var_export($arg);
?>
Вывод до PHP 5.3:
'Второй аргумент'
Вывод в PHP 5.3 и выше:
Warning: func_get_arg(): Called from the global scope - no function context in /home/torben/Desktop/code/ml/fga.inc on line 3 false
Пример #3 Пример передачи аргументов по ссылке и по значению с func_get_arg()
<?php
function byVal($arg) {
echo 'Передан : ', var_export(func_get_arg(0)), PHP_EOL;
$arg = 'baz';
echo 'После изменения : ', var_export(func_get_arg(0)), PHP_EOL;
}
function byRef(&$arg) {
echo 'Передан : ', var_export(func_get_arg(0)), PHP_EOL;
$arg = 'baz';
echo 'После изменения : ', var_export(func_get_arg(0)), PHP_EOL;
}
$arg = 'bar';
byVal($arg);
byRef($arg);
?>
Результат выполнения данного примера:
Передан : 'bar'
После изменения : 'bar'
Передан : 'bar'
После изменения : 'baz'
Примечания
Замечание:
Так как для определения параметров данной функции необходим контекст выполнения, она не может быть передана в качестве параметра в версиях PHP до 5.3.0. Если функцию все же необходимо передать, то нужно присвоить ее переменной, которую уже можно использовать при передаче.
Замечание:
Если аргументы были переданы по ссылке, то все изменения аргументов будут отражены на возвращаемых функцией значениях.
Замечание: Эта функция возвращает только копии переданных аргументов, и не возвращает значения по умолчанию (непереданных) аргументов.
Коментарии
func_get_arg() returns a *copy* of the argument, to my knowledge there is no way to retrieve references to a variable number of arguments.
I have a module system in my game at http://lotgd.net where I'd like to be able to pass a variable number of arguments to functions in a module, and pass them by reference if the module asks for it by reference, but you can't accept optional parameters as references, nor can you retrieve the reference on a variable number of arguments. Looks like my modules will have to do with out the ability to accept parameters to their functions by reference.
I actually think that there is need for such "do absolutely everything" functions. I use them mostly as tools for rapid prototyping.
And there is a method with which you may be able to pass several strings to a function: ereg();
Another use for such functions is to create little code snippets for other people out there. They won't have to edit the function any longer if they do not use a parameter. They just don't name it when calling the function.
This results in allrounder functions that are very robust in their use.Normally you just have a little code snippet (e.g. ip-blocking snippets). Through this type of programming you have whole functions.
func_get_arg() does not appear to be allowed to be used as a function argument itself within class constructors in PHP 5.0.2 (wonk-ay!!!):
<?php
class ABC
{
function __construct()
{
foreach (func_get_args() as $name => $value)
{
echo <<<EOT
<br/>
$name : $value <br/>
<br/>
EOT;
}
}
}
class DEF extends ABC
{
function __construct()
{
parent::__construct(func_get_arg(0),
func_get_arg(1),
func_get_arg(2));
}
}
$def = new DEF(123123, "asdfasdf", "blahblahblah");
?>
The above script generates:
Fatal error: func_get_arg(): Can't be used as a function parameter in c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx.php on line 23
There are, however, no problems when passing these as parameters to regular functions.
This functions seems so powerful... just when i saw it i thought about writing a fast average of n numbers function so here it is, it is very simple... example usage included.
<?php
//Calculate the average of the numbers given
function avg(){
$sum = 0;
for($i = 0; $i < func_num_args(); $i++){
$sum += func_get_arg($i);
}
$avg = $sum / func_num_args();
return $avg;
}
echo sprintf("%.2f",avg(2,1,2,1,3,4,5,1,3,6));
?>
This function may work differently from php5 to php7, in the latter it seems to reference the variable, while in php5 it returns the original argument.
I have confirmed with the versions below, but this will require further confirmation as to whether this is a 5 versus 7 issue.
function test( $test ){
$test = '123';
echo func_get_arg(0);
}
test( '321' );
//in php 5.5.9, this script will write '321'
//in php 7.0.33, this script will write '123'