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");
?>
func_num_args
(PHP 4, PHP 5)
func_num_args — 関数に渡された引数の数を返す
説明
int func_num_args ( void )関数に渡された引数の数を取得します。
この関数は func_get_arg() および func_get_args() と組み合わせて使用され、 ユーザ定義関数において可変長の引数リストを使用することができるようになります。
返り値
現在のユーザ定義関数に渡された引数の数を返します。
エラー / 例外
ユーザ定義関数の外部からコールされた場合に警告を発生します。
例
例 751. func_num_args() の例
<?php
function foo()
{
$numargs = func_num_args();
echo "引数の数: $numargs\n";
}
foo(1, 2, 3); // '引数の数: 3' という出力になります
?>
注意
注意: この関数は、 カレントスコープに依存してパラメータの詳細を決定しますので、 関数パラメータとして使用することはできません。 もし、この値を渡さなければならない場合、戻り値を変数に割り当て、 その変数を渡してください。
参考
| func_get_arg() |
| func_get_args() |
func_num_args
padron at aaargh dot com dot br
20-Jan-2007 04:18
20-Jan-2007 04:18
neelam_ab2003 at yahoo dot co dot in
11-May-2006 04:40
11-May-2006 04:40
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
17-Mar-2006 04:24
17-Mar-2006 04:24
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)
jared at ws-db dot com
07-Sep-2005 01:46
07-Sep-2005 01:46
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!");
andy at arakka dot co dot th
12-May-2005 11:16
12-May-2005 11:16
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 "<br>";
}
ashley at dcs dot warwick dot ac dot uk
17-Apr-2002 08:40
17-Apr-2002 08:40
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);
thalis at NOSPAMcs dot pitt dot edu
30-Mar-2002 05:05
30-Mar-2002 05:05
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()
}
}