1

好的,我正在学习如何制作我自己的自定义 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);

好的,我想的是,如果 count 得到的参数与被调用类的 count 参数不同,那么 404,可以说我可以数我的 $this->params 它给了我一个 3。但是被调用类中的参数怎么样?我们如何通过 call_user_func_array 计算被调用类中的参数

感谢您的关注

亚当斋月

4

3 回答 3

1

据我所知,不使用反射就无法获取方法的参数计数。但是,它非常简单,看起来像这样:

$reflector = new ReflectionClass('Profiles');
$method = $reflector->getMethod('index');
$parameters = $method->getParameters();

printf('%s expects %d parameters', $method->name, count($parameters));

将产生

index expects 2 parameter

请注意,反射总是有代价的。但是,这对性能的影响应该不明显。

于 2011-01-21T09:35:43.830 回答
1

你可以使用反射:

$refclass = new ReflectionClass($controller);
$param_count = $refclass->getMethod($method)->getNumberOfRequiredParameters();
if ($param_count <= count($this->params)) {
    $refclass->invokeArgs($controller, $this->params);
} else {
    // 404
}

可以通过检查是否有太多参数来变得更严格。

于 2011-01-21T09:36:34.663 回答
0

通过 call_user_func_array 计算被调用类中的参数

其实很简单。您可以通过使用func_get_args将参数获取到数组中来确定参数的数量,然后对它们进行计数。例子:

<?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.
于 2011-01-21T09:36:39.260 回答