处理页面切换的最佳方法是什么?

时间:2015-09-05 12:32:45

标签: php

目前我使用switch($_GET['page'])来简单地说出来。这是一个简单的解决方案,基本上可以在任何地方使用。

然而,遗憾的是有些项目已经增长了很多,我想知道,如果有更好的方法吗?

这是我目前如何切换页面的基础:

// There is more complex .htacces to translation of friendly-urls behind it, but for example sake, these variables are being produced:
$lext = array(
    'parent_page' => 'about-us',
    'child_page' => 'map-to-somewhere',
    'child_id' => NULL, // if it would be a article or something, it would be example.com/{parent_page}/{child_id}-some-friendly-url.html
);

switch ($lext['parent_page']) {
    case 'about-us':
        // about us page
    break;
    case '':
        // home
    break;
    default:
        // 404
    break;
}

在交换机案例中,它会触发一个函数或包含一个文件。结果是产生最快的页面加载结果。

所以我想知道,对于大量的流量和你的“index.php”又名。着陆文件得到了很多命中。什么是最快最简单的解决方案?
由于最简单或最愚蠢的解决方案似乎产生了最好的结果,如果出现以下情况,我会感到惊讶:

if ($lext['parent_page'] == 'about-us') {
    // about us page
} else if ($lext['parent_page'] == '') {
    // home
} else {
    // 404
}

..会更快,更好地成为switch()

我已经搜索过类似问题的SO并测试了所有答案,但我发现的答案并不是很好。

2 个答案:

答案 0 :(得分:1)

多个答案。在很大程度上取决于您的项目以及您想要做多少重构。我关注的不是速度,而是代码可扩展性和易维护性。 switch除了很多案件之外的其他任何事情都不会导致你对if-else或其他方式有任何明显的减速。

一种方法可能是进入MVC框架的世界,通常每页都有一个控制器方法,允许您在代码中进行一个漂亮,干净的拆分。例如,使用Code Igniter,您可以指定页面:

class MySite {

    /* constructor etc */

    public function page_1() {
        //this is called on visits to /page_1
        //load a view for this page, etc
    }

    public function page_13() {
        //this is called on visits to /page_3
        //load a view for this page, etc
    }

}

更简单的方法可能是制作可用案例的JSON数据文件以及每个案例中应该发生的事情。

{
    "page_1": {"inc": "page_1.php"},
    "page_13": {"func:": "some_func"},
}

然后,在你的PHP中:

//get data
$data = @file_get_contents($fp = 'pages_data.txt') or die("Couldn't load ".$fp);
$data = json_decode($data, 1);

//look for requested page in data - if found, include file or run function...
if (isset($data[$lext['parent_page']])) {

    $item = $data[$lext['parent_page']];

    //...include file
    if (isset($item['inc']) && file_exists($item['inc']))
        include $item['inc'];

    //...run function
    else if (isset($item'func']) && function_exists($item['func']))
        $item['func']();

} else
    //404...
}

答案 1 :(得分:0)

取决于您管理网页的方式。如果您必须require每个页面文件,那么您始终只需加载该文件:

$page = isset($_REQUEST['page']) ? $_REQUEST['page'] : 'index';

if (file_exists(__DIR__.'/views/'.$page.'.php')) {
    require(__DIR__.'/views/'.$page.'.php');
} else {
   switch ($page) {
       // Custom rules that does not fit to previous rule.
   }
}

我建议使用类/动作结构动态加载请求的页面(像大多数框架一样)。

[index.php]

$route = isset($_REQUEST['route']) ? $_REQUEST['route'] : 'index';
$page = explode('/', $route);

require_once(__DIR__.'/controller/'.ucfirst($route[0]).'Controller.php');

$className = ucfirst($route[0]).'Controller';
$class = new $className();
$class->{$route[1]}();

某些警告

始终尝试将您的请求列入白名单,不要忘记空值默认值,如果您可以通过POST或GET传递路线信息,请使用$_REQUEST

对于SEO Url,您将使用.htaccess和数据库。