过去几周我在php中写了一个网站,我脑子里总是有一个问题。在我的index.php上,我像这样路由所有模板文件
if(isset($_GET['search'])){
include_once 'template/template.search.php';
}
elseif(isset($_GET['newsletter'])){
include_once 'template/template.newsletter.php';
}
elseif(isset($_GET['product'])){
include_once 'template/template.product.php';
}
elseif(isset($_GET['categories'])){
include_once 'template/template.categorie.php';
}
elseif(isset($_GET['about'])){
include_once 'template/template.about.php';
}
elseif(isset($_GET['sitemap'])){
include_once 'template/template.sitemap.php';
}
else
{
include_once 'template/template.index.php';
}
但对我来说它看起来不是很干净。是否有更好的可能性来处理这样的工作?
我已经尝试过这样,但没有为我效劳
$i = 0 ;
switch($i){
case(isset($_GET['search'])):
include_once 'template/template.search.php';
break;
default:
include_once 'template/template.index.php';
break;
}
编辑:更好的写在标题中有些误导你,所以我正在寻找最好的表现。
答案 0 :(得分:11)
这个怎么样?
$templates = array('search',
'newsletter',
'product',
'categories',
'about',
'sitemap',
'index');
foreach ($templates as $template)
{
if (isset($_GET[$template]))
{
include_once "template/template.$template.php";
break;
}
}
你真的应该指定一组有效的模板 - 它更安全。
我想另一种方法是搜索相反的方式:
$templates = array('search',
'newsletter',
'product',
'categories',
'about',
'sitemap',
'index');
foreach ($_GET as $key => $val)
{
if (in_array($key, $templates))
{
include_once "template/template.$key.php";
break;
}
}
答案 1 :(得分:4)
假设$_GET
仅包含您可以执行的includes
:
foreach ($_GET as $key => $val){
if(isset($key)){
include_once 'template/template.'.$val.'.php';
break;
}
}
答案 2 :(得分:3)
它不是太清洁,但switch是最好用的。可读性提高了约15,000%。
switch(true) {
case isset($_GET['search']):
include_once 'template/template.search.php';
break;
// do more
default:
include_once 'template/template.index.php';
break;
}
答案 3 :(得分:2)
只是一些想法......
if
s的else
s系列也会在几微秒内执行。代码可维护性和健壮性是的一个问题。
我发现稍微不习惯使用开关有点令人不满意甚至是危险,因为
事实上,我发现界面有点奇怪。传递一个枚举可能页面的“目标”变量似乎对我来说更加一致。这将消除同时设置两个页面选择标志的奇怪情况。
然后你可以有一个简单的目标列表,并计算目标页面的名称或将它们存储在一个关联数组中(如果你真的不能以一致的方式命名它们,虽然我想知道什么是奇怪的要求阻止你这样做。)
我考虑的稳健性的关键点是
由于所有这些原因,我会改变页面的选择方式,如下所示:
$pages = array ( // single data source
"search",
"newsletter",
// etc...
);
@$page = $pages=[$_GET["page"]]; // single page selector
if (!$page) $page = "index"; // explicit default case
include "template/template.$page.php"; // no reason to include only once
// if someone else happens to include the template, better have the page
// break down immediately and correct the problem than letting a piece of
// buggy code live happily somewhere in your scripts
答案 4 :(得分:0)
您可以使用数组:如果您在内部找到了密钥,请使用它,否则只需使用默认值:
<?php
$tpl = array(
'search' => 'template/template.search.php',
'newsletter' => 'template/template.newsletter.php',
'product' => 'template/template.product.php'
#...
);
foreach($_GET as $get){
if(array_key_exists($get, $tpl)) include_once($tpl[$get]); // assuming search is within $get
}
?>
答案 5 :(得分:0)
您可以在查询字符串中使用变量(如t)来指示您要使用的模板,然后根据该模板动态包含模板名称。因此,如果您的网址类似于:mysite.com/page.php?t=newsletter&blah=1& ...,那么您需要做的就是:
include_once('template/template.' . $_GET['t'] . '.php');