我正在尝试创建自己的小MVC系统,它的工作非常好,但我遇到的一个问题是将变量解析为方法。
您看到我使用网址重写在index.php上创建每个网址,然后按网址数据设置网页,例如/ email / 1/34 /
然后我创建了一个像这里的对象。
<?php
$page = $urlsplit[0];
$variables = array($urlsplit[1], $urlsplit[2]);
$page->callmethod($variables);
?>
我想要它做的是,不是将数组解析为方法,而是应该这样做。
$page->callmethod($variables[0], $variables[1]);
知道我怎么能这样做吗?
答案 0 :(得分:2)
要动态调用$page->callmethod($variables[0], $variables[1])
,您可以使用call_user_func_array
:
call_user_func_array(array($page, 'callmethod'), $variables);
答案 1 :(得分:0)
实际上,使用某种正则表达式在多个部分中拆分URL会更有意义。
考虑这个片段:
/*
$url = '/user/4/edit'; // from $_GET
*/
$pattern = '/(?P<controller>[a-z]+)(:?\/(?:(?P<id>[0-9]+)\/)?(?P<action>[a-z]+))?/';
if ( !preg_match( $pattern, $url, $segments ) )
{
// pattern did not match
}
$controller = new $segments['controller'];
if ( method_exists( $controller, $segments['action'] ) )
{
$action = $segments['action'];
$param = $segments['id'];
}
else
{
$controller = new ErrorController;
$action = 'notFound';
$param = $url;
}
$response = $controller->$action( $param );
当然,在真正的MVC实现中会有更多的事情发生,但这应该可以解释这个概念。