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.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 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>"; } ?>