Function handling 函数
在线手册:中文  英文

func_num_args

(PHP 4, PHP 5)

func_num_argsReturns the number of arguments passed to the function

说明

int func_num_args ( void )

Gets the number of arguments passed to the function.

This function may be used in conjunction with func_get_arg() and func_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.0 This function can now be used in parameter lists.
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 -1.

错误/异常

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

范例

Example #1 func_num_args() example

<?php
function foo()
{
    
$numargs func_num_args();
    echo 
"Number of arguments: $numargs\n";
}

foo(123);   
?>

以上例程会输出:

Number of arguments: 3

Example #2 func_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 以前的版本中不能用作函数的参数。如必须传递此值时,可将结果赋与一个变量,然后用此变量进行传递。

参见


Function handling 函数
在线手册:中文  英文

用户评论:

luisguillermo dot quevedovelez at gmail dot com (2012-03-13 07:32:48)

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.

Dennis Robinson from basnetworks dot net (2009-06-29 21:29:25)

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.

padron at aaargh dot com dot br (2007-01-19 23:18:57)

func_num_args(), func_get_args() and func_get_arg() can be very useful to emulate overloading in PHP.

Suppose you have a class to add a user in a system, and that you want to allow 2 ways of doing it. The first way would be passing an array with all the user info in it, and the second way would be passing each user attribute as a single argument.

<?php

class Test {

    function 
insertUser() {

        
// gets the number of parameters
        
$numArgs func_num_args();
        
        
// make decisions based on the arguments number
        
if ($numArgs == 1) {
            
// if it's only one argument, we suppose that it is an array with user info
            
            // gets the first argument
            
$user func_get_arg(0);
            
            
// checks if it really is an array
            
if (is_array($user)) {
                
                
// here you should check if the array contains all necessary fields
                
                // adds the user
                
echo "User added.<br/>";
                echo 
"ID: " $user["id"] . "<br/>";
                echo 
"NAME: " $user["name"] . "<br/>";
                echo 
"EMAIL: " $user["email"] . "<br/>";
                
            } else {
                
                
// generates an error if argument is not an array
                
echo "Argument is not an array: " $user ".<br/>";
                
            }
            
        } else if (
$numArgs == 3) {
            
// if the function receives 3 arguments, we assume that they
            // are 'id', 'name' and 'email' respectively
            
            // inserts the user into the system
            
echo "User added.<br/>";
            echo 
"ID: " func_get_arg(0) . "<br/>";
            echo 
"NAME: " func_get_arg(1) . "<br/>";
            echo 
"EMAIL: " func_get_arg(2) . "<br/>";
                        
        } else {
            
            
// if the number of arguments is different from 1 and 3
            // an error will be generated
            
            
echo "Wrong argument number.<br/>";
            echo 
"Arguments received: " func_num_args();
            
        }
    }

}

// creates an Test object
$objTest = new Teste();

// inserts an user passing an array with all his info
$objTest->insertUser(array("id" => 1"name" => "George W. Bush""email" => "jackass@whitehouse.gov"));

echo 
"<br/>";

// inserts an user providing each attribute as a single argument
$objTest->insertUser(2"Vicente Fox""iloveusa@disney.com");

echo 
"<br/>";

// this will generate an error, because only 2 arguments were passed
$objTest->insertUser(3"Tony Blair");

?>

neelam_ab2003 at yahoo dot co dot in (2006-05-11 00:40:07)

Just adding a note to JARED's Note.
func_num_args() works if and only if called from within a function definition BECAUSE it calculates the number of arguments sent while function calling. That is why it gives
'1' in helloWorld("HelloWorld!") and '2' in helloWorld("HelloWorld!", "HowdyWorld!") - There is nothing to do with DEFAULT args.
If you call the same function as helloWorld(); "No args passed"
It will give a warning for wrong function call ("Warning: Missing argument 1 for helloWorld()") and the result of func_num_args() will be '0'.

friz at godshell dot com (2006-03-16 11:24:03)

This function comes in extremely handy in OO Classes.  My focus is currently PHP 4, but this technique probably works just as well in PHP 5.

<?php
Class foo {
   
// constructor, other methods, etc

   
function somedata($somedata '') {
      if (
func_num_args() > 0) {
         
$this->somedata $somedata;
      }

      return 
$this->somedata;
   }
}
?>

This allows for a default value to be set, while not requiring the parameter.  (Yes, I'm aware that it only warns when you do, but I think this is a little cleaner)

jared at ws-db dot com (2005-09-06 09:46:41)

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!");
?>

andy at arakka dot co dot th (2005-05-11 19:16:50)

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() > ) echo " = " $value ;
  echo 
"<br>";
}
?>

ashley at dcs dot warwick dot ac dot uk (2002-04-17 04:40:26)

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+$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);
?>

thalis at NOSPAMcs dot pitt dot edu (2002-03-29 12:05:31)

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()
    
}
}
?>

易百教程