将变量从数组解析为方法

时间:2012-03-31 20:32:05

标签: php oop url-routing

我正在尝试创建自己的小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]);

知道我怎么能这样做吗?

2 个答案:

答案 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实现中会有更多的事情发生,但这应该可以解释这个概念。