php很多elseif语句更好的表现

时间:2013-01-11 18:45:36

标签: php

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

编辑:更好的写在标题中有些误导你,所以我正在寻找最好的表现。

6 个答案:

答案 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系列也会在几微秒内执行。

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

我发现稍微不习惯使用开关有点令人不满意甚至是危险,因为

  • 重要信息(GET索引和实际页面名称)仍然是重复的,并以重复代码的形式埋葬,
  • 如果两个条件同时发生,那么开关会表现得很奇怪(我想它会采取第一个满足的条件,但仍然不是很干净)
  • 添加或删除页面仍然需要复制/删除3或4行代码,无意中复制块可能会被忽视并让程序员陷入烦恼“我确定这件事已经解决了(但实际上并没有't)“情况。

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

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

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

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

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

$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');