目前我使用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并测试了所有答案,但我发现的答案并不是很好。
答案 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
和数据库。