• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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.0If 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.

    参见

    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.