• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • func_num_args()

    (PHP 4, PHP 5, PHP 7)

    Returns the number of arguments passed to the function

    说明

    func_num_args(void): int

    Gets the number of arguments passed to the function.

    This function may be used in conjunction withfunc_get_arg()andfunc_get_args()to allow user-defined functions to accept variable-length argument lists.

    返回值

    Returns the number of arguments passed into the current user-defined function.

    更新日志

    版本说明
    5.3.0This function can now be used in parameter lists.
    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 returns -1.

    错误/异常

    Generates a warning if called from outside of a user-defined function.

    范例

    Example #1func_num_args()example

    <?php
    function foo()
    {
        $numargs = func_num_args();
        echo "Number of arguments: $numargs\n";
    }
    foo(1, 2, 3);   
    ?>
    

    以上例程会输出:

    Number of arguments: 3
    

    Example #2func_num_args()example before and after PHP 5.3

    test.php
    <?php
    function foo() {
        include './fna.php';
    }
    foo('First arg', 'Second arg');
    ?>
    fna.php
    <?php
    $num_args = func_num_args();
    var_export($num_args);
    ?>
    

    Output previous to PHP 5.3:

    2
    

    Output in PHP 5.3 and later will be something similar to:

    Warning: func_num_args():  Called from the global scope - no function
    context in /home/torben/Desktop/code/ml/fna.php on line 3
    -1
    

    注释

    Note:

    因为函数依赖于当前作用域以确定参数的细节,所以在5.3.0 以前的版本中不能用作函数的参数。如必须传递此值时,可将结果赋与一个变量,然后用此变量进行传递。

    参见

    • func_get_arg() 返回参数列表的某一项
    • func_get_args() 返回一个包含函数参数列表的数组
    • ReflectionFunctionAbstract::getNumberOfParameters() 获取参数数目
    Just a note for anyone wondering. This function doesn't include params that have a default value, unless you pass one in to overwrite the default param value. Not sure if that makes sense, so here's an example:
    <?php
    function helloWorld($ArgA, $ArgB="HelloWorld!") {
     return func_num_args();
    }
    // The following will return 1
    $Returns1 = helloWorld("HelloWorld!");
    // The following will return 2
    $Returns2 = helloWorld("HelloWorld!", "HowdyWorld!");
    ?>
    
    This function comes in handy, and I believe is the only solution, when you have an optional parameter that can take any type of data.
    For example:
    <?php
    // $data can be of any type, including null
    function my_function($name, $data = null)
    {
      if ($data !== null)
      {
        // Do something with $data
        // If you call my_function('something'), this WILL NOT be reached
        // If you call my_function('something', null), this WILL NOT be reached
      }
    }
    ?>
    The problem with the above function is that you will never be able to use null as the value for $data. To fix this, use func_num_args() like so:
    <?php
    // $data can be of any type, including null
    function my_function($name, $data = null)
    {
      if (func_num_args() >= 2)
      {
        // Do something with $data
        // If you call my_function('something'), this WILL NOT be reached
        // If you call my_function('something', null), this WILL be reached
      }
    }
    ?>
    This solution works because func_num_args() reports exactly how many arguments were passed when the function was called. It does not take into account when default argument values are used.
    The idea of func_get_args() is to construct functions of variable number of parameters like
    <?php
    function var_param_func(){
      if(func_num_args()==0){
        //do one thing
      }
      if(func_num_args()==1)
        //do another thing
        //get the args with func_get_args()
      }
    }
    ?>
    
    I had defined a function function_name(){ ...} as a drupal callback.
    I try to get how many params where passed
    I got a Error and my Site falls down
    I've replaced func_get_args() instead func_num_args() and my Site was restored.
    I conclude you can not use func_num_args() in callbacks.
    Hope it helps.
    If you are using PHP 7 and func_num_args is in your base class which you extended, you can pass your arguments with the 'spat' operator.
    class Sql {
    public function doGetWhere(...$args) {
    $num_args = func_num_args();
       $args_list = func_get_args();
       echo '<pre>';
       var_dump($args_list);
       echo '<pre>';
     }
    }
    class Member extends Sql {
    public function getWhere(...$args) {
      $this->doGetWhere(...$args);
       }
    }
    $member = new Member();
    $member->getWhere('first_name','last_name','userlevel','email','where','email','=',$sub_email);
    However, take note that if you 'new up' the 'Sql' class in your 'Member' class above, instead of extending it, you will not need to pass your arguments as a variable. Just my two cents. -Bruce tong
    If you want to pass the parameters on intact to another function, use func_get_args and call_user_func_array (careful - this one is only available in recent PHP versions). For example:
    <?php
    /* Print an HTML tag. This accepts a variable number of arguments:
      the first should be the name of the tag, followed by pairs of
      arguments that describe keys and values. The values are printed
      with surrounding double quote characters. */
    function printTag() {
     $numArgs = func_num_args();
     if ($numArgs < 1) die("printTag given no arguments");
     
     echo "<" . func_get_arg(0);
     for ($i = 1; $i < $numArgs; $i+=2) {
      echo " " . func_get_arg($i);
      if ($i+1 < $numArgs)
       echo "=\"" . func_get_arg($i+1) . "\"";
     }
     echo ">";
     
    }
    /* Print an HTML tag with a newline on the end */
    function printTagNL() {
     $args = func_get_args();
     call_user_func_array("printTag", $args);
     echo "\n";
    }
    printTagNL("input", "type", "hidden", "name", "SORTORDER", "value", $columnNo);
    ?>
    
    func_num_args() can be used in conjunction with named arguments, also. For example:
    <?php
    function DebugShow( $label, $value ) {
     echo "# " . $label ;
     if ( func_num_args() > 1 ) echo " = " . $value ;
     echo "<br>";
    }
    ?>