3

过去几周我正在用 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;
}

编辑:在标题中写得更好有点误导你们中的一些人,所以我肯定在寻找最好的表现。

4

6 回答 6

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;
    }
}
于 2013-01-11T18:52:10.907 回答
4

假设$_GET只有includes你能做的:

foreach ($_GET as $key => $val){
    if(isset($key)){
        include_once 'template/template.'.$val.'.php';
        break;
    }
}
于 2013-01-11T18:49:29.280 回答
3

它不是太干净,但最好使用开关。可读性提高了大约 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;
}
于 2013-01-11T18:49:15.177 回答
2

只是一些转瞬即逝的想法...

  • 这里的性能根本不是问题。
    即使是一系列没有ifs 的elses 也会在几微秒内执行。

但是,代码的可维护性和健壮性一个问题。

我发现 switch 的稍微有点骇人听闻的使用有点令人不满意甚至是危险的,因为

  • 重要的信息(GET 索引和实际的页面名称)仍然被重复并埋在一堆重复的代码中,
  • 如果两个条件恰好同时为真,则开关的行为会很奇怪(我想它会采用第一个满足的条件,但这仍然不是很干净)
  • 添加或删除页面仍然需要复制/擦除 3 或 4 行代码,并且无意中复制块可能会被忽视并使程序员陷入烦人的“我确定这件事已经解决(但实际上没有) “ 情况。

事实上,我觉得界面有点奇怪。传递一个枚举可能页面的“目标”变量对我来说似乎更一致。这将消除同时设置两个页面选择标志的奇怪情况。

然后,您可以拥有一个简单的目标列表,并计算目标页面的名称或将它们存储在 assoc 数组中(如果您真的不能以一致的方式命名它们,尽管我想知道什么奇怪的要求会阻止您这样做)。

我会考虑的稳健性的关键点是

  • 无数据重复
  • 没有“惰性”默认情况(除非默认值来自功能需求)

由于所有这些原因,我会更改页面的选择方式,如下所示:

$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
于 2014-01-24T13:48:27.587 回答
0

You can use an array: if you find the key inside, use it, otherwise just use default :

<?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
}

?>
于 2013-01-11T18:56:09.747 回答
0

You could use a variable (like t) in the query string to indicate the template you want to use, and then just include the template name dynamically based on that. So if your URL looks something like: mysite.com/page.php?t=newsletter&blah=1&..., then all you need to do is:

include_once('template/template.' . $_GET['t'] . '.php');
于 2013-01-11T18:56:09.803 回答