获取类函数的参数数

Get number of arguments for a class function

提问人:ComputerUser 提问时间:10/21/2010 更新时间:10/22/2010 访问量:5814

问:

有没有办法检测类中函数的参数数?

我想做的是以下几点。

$class = 'foo';
$path = 'path/to/file';
if ( ! file_exists($path)) {
  die();
}

require($path);

if ( ! class_exists($class)) {
  die();
}

$c = new class;

if (num_function_args($class, $function) == count($url_segments)) {
  $c->$function($one, $two, $three);
}

这可能吗?

PHP 函数

评论

0赞 acm 10/21/2010
不确定。但是,在类定义中,您可以使用类似 func_get_arg() [php.net/manual/en/function.func-get-arg.php] 之类的东西,并根据收到的参数执行不同的事情。
1赞 erisco 10/21/2010
您应该考虑另一种设计。您能为您的问题提供更多背景信息吗?
1赞 Gordon 10/21/2010
请明确您是否想知道在运行时传递给函数的参数数量,例如 (3 个参数)或签名中给出的参数数量,例如 (4 个参数,2 个必需,2 个可选)fn(1,1,1)function fn($a,$b$c=0,$d=0)

答:

6赞 Mark Baker 10/21/2010 #1

使用反射,但这实际上是代码中的开销;并且方法可以具有任意数量的参数,而无需在方法定义中显式定义它们。

$classMethod = new ReflectionMethod($class,$method);
$argumentCount = count($classMethod->getParameters());

评论

0赞 Cypher 3/20/2014
虽然大多数语言中的反射方法往往会花费更多的 CPU 周期,但我使用的是这种方法,我看不出有或没有执行时间有任何区别。
0赞 Mark Baker 3/20/2014
@Cypher 自此答案发布以来,经过 2 1/2 年的 PHP 改进,Reflection 有了显着的改进
4赞 Yanick Rochon 10/21/2010 #2

请改用call_user_func_array,如果传递的参数过多,它们将被忽略。

演示

class Foo {
   public function bar($arg1, $arg2) {
       echo $arg1 . ', ' . $arg2;
   }
}


$foo = new Foo();

call_user_func_array(array($foo, 'bar'), array(1, 2, 3, 4, 5));

将输出

1, 2

对于动态参数,请使用如下func_get_args

class Foo {
   public function bar() {
       $args = func_get_args();
       echo implode(', ', $args);
   }
}


$foo = new Foo();

call_user_func_array(array($foo, 'bar'), array(1, 2, 3, 4, 5));

将输出

1, 2, 3, 4, 5

评论

0赞 Brian Hogg 1/20/2016
还会抛出警告,并且将过多的参数传递给某些函数(如is_numeric)实际上会改变该函数的行为。call_user_func_array
0赞 Yanick Rochon 1/20/2016
@BrianHogg当然。由于传递给函数的参数被推送到堆栈,因此如果堆栈已满,您将获得奇怪的行为。如果这种情况成为您的情况,您的问题不在于函数的行为:)例如,在这种情况下使用单个数组 arg。
0赞 Brian Hogg 1/20/2016
最近流行的 CMS 出现了一个问题,其中验证/过滤函数调用了 3 个参数(值加上请求的详细信息),但不是查看第一个参数并忽略其他参数,而是返回 NULL 并且验证失败。不要认为这是堆栈溢出(哈哈)问题,而是影响函数输出的其他参数,而不是简单地被忽略。is_numericis_numeric
6赞 Gordon 10/22/2010 #3

若要获取函数或方法签名中的参数数,可以使用

$rf = new ReflectionMethod('DateTime', 'diff');
echo $rf->getNumberOfParameters();         // 2
echo $rf->getNumberOfRequiredParameters(); // 1

若要获取在运行时传递给函数的参数数,可以使用

function fn() {
    return func_num_args();
}
echo fn(1,2,3,4,5,6,7); // 7