确定我正在学习如何制作我自己的自定义mvc系统,到目前为止我已经创建了路由器和控制器之类的东西。
示例我有一个控制器配置文件类和一个网址www.helloworld.com/args1/args2/args3
class Profiles
{
function index($args1,$args2)
{
echo var_dump($args1,$args2);
}
}
继承人是我的路由器类的一部分,它执行方法和参数
if (is_callable(array($controller,$method))) {
call_user_func_array(array($controller, $method), $this->params);
}
到目前为止没有错误,但不知怎的,我需要提供404.如果$this->params
与我在count(params)
调用的方法中的call_user_func_array(array($controller, $method),
$this->params);
不同
好吧我的想法是,如果计数得到的参数与被叫类的计数参数不一样,那么404, 让我说我可以算上我的$ this-> params它给了我一个3.但是被叫类中的params怎么样? 我们如何通过call_user_func_array 计算被调用类中的参数?
感谢您查看
Adam Ramadhan
答案 0 :(得分:1)
据我所知,没有使用reflection的方法无法获取方法的参数计数。但是,它非常简单,看起来像这样:
$reflector = new ReflectionClass('Profiles');
$method = $reflector->getMethod('index');
$parameters = $method->getParameters();
printf('%s expects %d parameters', $method->name, count($parameters));
将产生
index expects 2 parameter
请注意,反射总是带来成本。但是,这对性能的影响不应该是显而易见的。
答案 1 :(得分:1)
你可以使用反射:
$refclass = new ReflectionClass($controller);
$param_count = $refclass->getMethod($method)->getNumberOfRequiredParameters();
if ($param_count <= count($this->params)) {
$refclass->invokeArgs($controller, $this->params);
} else {
// 404
}
通过检查参数是否太多可以更加严格。
答案 2 :(得分:0)
通过call_user_func_array
计算被调用类中的params
实际上相当简单。您可以使用func_get_args将参数添加到数组中,然后count来确定参数的数量。例如:
<?php
function foo( ) {
echo "I have received " . count( func_get_args( ) ) . " parameters.";
}
foo( ); // I have received 0 parameters.
foo( 1, 2, 3, 4, 5 ); // I have received 5 parameters.