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

ほんの少しの通過する考え...

  • ここでのパフォーマンスはまったく問題ではありません。sのない一連のs
    でさえ、数マイクロ秒で実行されます。ifelse

ただし、コードの保守性と堅牢性問題です。

少しハックなスイッチの使用は、やや不十分であるか、危険でさえあると思います。

  • 重要な情報(GETインデックスと実際のページ名)はまだ複製され、反復的なコードのグロブに埋め込まれています。
  • 2つの条件が同時に真になると、スイッチは奇妙な動作をします(最初に満たされた条件が適用されると思いますが、それでもあまりきれいではありません)
  • ページを追加または削除するには、3行または4行のコードを複製/消去する必要があり、誤ってブロックを複製すると、気付かれずにプログラマーが煩わしくなります。「この問題は解決したと確信しています(実際には解決していませんでした)。 " 状況。

実際のところ、インターフェイスは少し奇妙だと思います。可能なページを列挙する単一の「ターゲット」変数を渡すことは、私にはより一貫しているようです。これにより、2つのページ選択フラグが同時に設定されるという奇妙なケースが排除されます。

次に、ターゲットの簡単なリストを作成し、ターゲットページの名前を計算するか、連想配列に格納します(実際に一貫した方法で名前を付けることができない場合は、どのような奇妙な要件が原因でそれをやって)。

堅牢性について私が検討する重要なポイントは次のとおりです。

  • データの重複はありません
  • 「怠惰な」デフォルトのケースはありません(デフォルト値が機能要件に由来する場合を除く)

これらすべての理由から、次のようにページの選択方法を変更します。

$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

配列を使用できます。内部にキーが見つかった場合はそれを使用し、それ以外の場合はデフォルトを使用します。

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

クエリ文字列で変数(tなど)を使用して、使用するテンプレートを示し、それに基づいてテンプレート名を動的に含めることができます。したがって、URLがmysite.com/page.php?t=newsletter&blah=1&...のようになっている場合は、次のようにする必要があります。

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