我正在为一个项目开发一个小型MVC,我使用一个字符串来控制哪些类被实例化,哪些方法被调用。一切正常工作,但我现在想增加调用方法的能力,超过了当前三个参数的限制。当然,在switch语句中很容易做到这一点,但是对于不同数量的参数,还有其他方法吗?在将来,我可能希望使用10个或更多的参数这样调用方法。
function __construct()
{
/**
* Get the url parameters.
*/
$url = (isset($_GET['url']) ? $_GET['url'] : 'Index');
$url = rtrim($url, '/');
$url = explode('/', $url);
for ($i = 0; $i < sizeof($url); $i++) {
$url[$i] = ucfirst(strtolower($url[$i]));
}
$file = 'controllers/' . $url[0] . '.php';
if (file_exists($file)) {
require $file;
} else {
error();
}
/**
* @var $controller Controller
*/
$controller = new $url[0];
$controller->loadModel($url[0]);
/*
* Call additional methods on the controller if requested.
*/
$args = max(sizeof($url) - 2, 0);
if (sizeof($url) > 1) {
switch ($args) {
case 0:
if (method_exists($controller, $url[1])) {
$controller->{$url[1]}();
$controller->index();
} else {
error();
}
break;
case 1:
if (method_exists($controller, $url[1]))
$controller->{$url[1]}($url[2]);
else
error();
break;
case 2:
if (method_exists($controller, $url[1]))
$controller->{$url[1]}($url[2], $url[3]);
else
error();
break;
case 3:
if (method_exists($controller, $url[1]))
$controller->{$url[1]}($url[2], $url[3], $url[4]);
else
error();
break;
}
} else {
$controller->index();
}
}这种优化在PHP中是可能的,还是只需要硬编码switch语句中的额外情况?性能不是问题。简单和泛化更受欢迎。
发布于 2015-07-14 18:10:38
使用call_user_func_array来完成这个任务
首先,可以从数组中提取控制器名称和方法名称:
$controller = count($url) > 0 ? array_shift($url) : 'DefaultController'; //Pop off of the array first element or default controller
$method = count($url) > 0 ? array_shift($url) : 'Index'; //Second element or Default Method然后,您可以这样做:
call_user_func_array(array($object,$method), $url);或者如果它是一个静态函数:
call_user_func_array(array($controller,$method), $url);发布于 2015-07-14 18:10:34
使用array_shift,您可以从数组中删除第一项并返回它,因此您可以这样做:
$controllerName = array_shift($url);
$method = array_shift($url);
$controller = new $controllerName;
$controller->loadModel($controllerName);由于这些项实际上已被移除,所以$url中的其余项是参数,您可以像这样使用call_user_func_array调用该方法:
call_user_func_array(array($controller, $method), $url);此函数调用第一个参数中指定的http://php.net/manual/en/language.types.callable.php。在本例中,它是对方法的引用,方法是使用对象(控制器)和要调用的方法的名称指定数组。
第二个参数中的数组被拆分,并作为单独的参数传递给方法。
https://stackoverflow.com/questions/31414047
复制相似问题