|
func_num_args
Returns the number of arguments passed to the function
(PHP 4, PHP 5)
Example 760. func_num_args() example<?php Code Examples / Notes » func_num_argsfriz
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) thalis
The idea of func_get_args() is to construct functions of variable number of parameters like 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() } } neelam_ab2003
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'. jared
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!"); ashley
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); padron
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"); ?> andy
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 " "; } |