func_get_arg()
(PHP 4, PHP 5, PHP 7)
返回参数列表的某一项
说明
func_get_arg(int $arg_num): mixed
从用户自定义函数的参数列表中获取某个指定的参数。
该函数可以配合func_get_args()和func_num_args()一起使用,从而使得用户自定义函数可以接受自定义个数的参数列表。
参数
- $arg_num
参数的偏移量。函数的参数是从0开始计数的。
返回值
返回指定的参数,错误则返回FALSE
。
更新日志
版本 | 说明 |
---|---|
5.3.0 | 该函数可以在参数列表中使用。 |
5.3.0 | If this function is called from the outermost scope of a file which has been included by callingincludeorrequirefrom within a function in the calling file, it now generates a warning and returnsFALSE .(不知道如何翻译跟好,直接参考例2即可明白) |
错误/异常
当在自定义函数的外面调用的该函数的时候会发出一个警告,或者是当$arg_num比实际传入的参数的数目大的时候也会发出一个警告。
范例
Example #1func_get_arg()例子
<?php function foo() { $numargs = func_num_args(); echo "Number of arguments: $numargs<br />\n"; if ($numargs >= 2) { echo "Second argument is: " . func_get_arg(1) . "<br />\n"; } } foo (1, 2, 3); ?>
Example #2func_get_arg()PHP 5.3 前后对比的例子
test.php <?php function foo() { include './fga.inc'; } foo('First arg', 'Second arg'); ?> fga.inc <?php $arg = func_get_arg(1); var_export($arg); ?>
PHP 5.3 版本之前的输出:
'Second arg'
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
Example #3func_get_arg()example of byref and byval arguments
<?php function byVal($arg) { echo 'As passed : ', var_export(func_get_arg(0)), PHP_EOL; $arg = 'baz'; echo 'After change : ', var_export(func_get_arg(0)), PHP_EOL; } function byRef(&$arg) { echo 'As passed : ', var_export(func_get_arg(0)), PHP_EOL; $arg = 'baz'; echo 'After change : ', var_export(func_get_arg(0)), PHP_EOL; } $arg = 'bar'; byVal($arg); byRef($arg); ?>
以上例程会输出:
As passed :'bar'
After change :'bar'
As passed :'bar'
After change :'baz'
注释
Note:因为函数依赖于当前作用域以确定参数的细节,所以在5.3.0 以前的版本中不能用作函数的参数。如必须传递此值时,可将结果赋与一个变量,然后用此变量进行传递。
Note:如果参数以引用方式传递,函数对该参数的任何改变将在函数返回后保留。
Note:This function returns a copy of the passed arguments only, and does not account for default (non-passed) arguments.
参见
func_get_args()
返回一个包含函数参数列表的数组func_num_args()
Returns the number of arguments passed to the function
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)); ?>
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.
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.
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.