首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP变量函数优化

PHP变量函数优化
EN

Stack Overflow用户
提问于 2015-07-14 18:03:28
回答 2查看 68关注 0票数 0

我正在为一个项目开发一个小型MVC,我使用一个字符串来控制哪些类被实例化,哪些方法被调用。一切正常工作,但我现在想增加调用方法的能力,超过了当前三个参数的限制。当然,在switch语句中很容易做到这一点,但是对于不同数量的参数,还有其他方法吗?在将来,我可能希望使用10个或更多的参数这样调用方法。

代码语言:javascript
复制
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语句中的额外情况?性能不是问题。简单和泛化更受欢迎。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-14 18:10:38

使用call_user_func_array来完成这个任务

首先,可以从数组中提取控制器名称和方法名称:

代码语言:javascript
复制
$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

然后,您可以这样做:

代码语言:javascript
复制
call_user_func_array(array($object,$method), $url);

或者如果它是一个静态函数:

代码语言:javascript
复制
call_user_func_array(array($controller,$method), $url);
票数 0
EN

Stack Overflow用户

发布于 2015-07-14 18:10:34

使用array_shift,您可以从数组中删除第一项并返回它,因此您可以这样做:

代码语言:javascript
复制
$controllerName = array_shift($url);
$method = array_shift($url);

$controller = new $controllerName;
$controller->loadModel($controllerName);

由于这些项实际上已被移除,所以$url中的其余项是参数,您可以像这样使用call_user_func_array调用该方法:

代码语言:javascript
复制
call_user_func_array(array($controller, $method), $url);

此函数调用第一个参数中指定的http://php.net/manual/en/language.types.callable.php。在本例中,它是对方法的引用,方法是使用对象(控制器)和要调用的方法的名称指定数组。

第二个参数中的数组被拆分,并作为单独的参数传递给方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31414047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档