©
This document uses PHP Chinese website manual Release
(PHP 4, PHP 5, PHP 7)
func_get_arg — 返回参数列表的某一项
$arg_num
)从用户自定义函数的参数列表中获取某个指定的参数。
该函数可以配合 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 calling include
or require from within a function in the
calling file, it now generates a warning and returns FALSE .
(不知道如何翻译跟好,直接参考例2即可明白)
|
当在自定义函数的外面调用的该函数的时候会发出一个警告,
或者是当 arg_num
比实际传入的参数的数目大的时候也会发出一个警告。
Example #1 func_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 #2 func_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 #3 func_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 );
?>
以上例程会输出:
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.
[#1] beta3designs [at] gmail [dot] com [2009-07-06 06:34:51]
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));
?>
[#2] mw atto lanfear dotto com [2004-12-07 14:56:01]
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.
[#3] anders at ingemann dot fakestuff dot de [2004-06-03 18:16:39]
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.
[#4] mightye (at) mightye (dot) org [2004-03-12 09:45:43]
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.