Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg

PHP : Function Reference : Function Handling Functions : func_num_args


Returns the number of arguments passed to the function (PHP 4, PHP 5)
int func_num_args ( )

Example 760. func_num_args() example

function foo()
$numargs = func_num_args();
"Number of arguments: $numargs\n";

foo(1, 2, 3);    // Prints 'Number of arguments: 3'

Code Examples / Notes » func_num_args


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.
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)


The idea of func_get_args() is to construct functions of variable number of parameters like
function var_param_func(){
       //do one thing
       //do another thing
       //get the args with func_get_args()


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'.


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


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:
/* 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(), 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.
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" => ""));
echo "<br/>";
// inserts an user providing each attribute as a single argument
$objTest->insertUser(2, "Vicente Fox", "");
echo "<br/>";
// this will generate an error, because only 2 arguments were passed
$objTest->insertUser(3, "Tony Blair");


func_num_args() can be used in conjunction with named arguments, also. For example:
function DebugShow( $label, $value ) {
 echo "# " . $label ;
 if ( func_num_args() > 1 ) echo " = " . $value ;
 echo "

Change Language

Follow Navioo On Twitter
eXTReMe Tracker