2010-12-01 345 views
3

我試圖優化下面的PHP If/Else語句。我可以重寫代碼以便使用caseswitch,還是應該保留它,或者是什麼?優化PHP如果/其他語句

代碼:

if(empty($_GET['id'])){ 
    include('pages/home.php'); 
}elseif ($_GET['id'] === '13') { 
    include('pages/servicestatus.php'); 
}elseif(!empty($_GET['id'])){ 
    $rawdata = fetch_article($db->real_escape_string($_GET['id'])); 
    if(!$rawdata){ 
     $title = ""; 
     $meta['keywords'] = ""; 
     $meta['description'] = ""; 
    }else{ 
     $title = stripslashes($rawdata['title']); 
     $meta['keywords'] = stripslashes($rawdata['htmlkeywords']); 
     $meta['description'] = stripslashes($rawdata['htmldesc']); 
     $subs = stripslashes($rawdata['subs']); 
     $pagecontent = "<article>" . stripslashes($rawdata['content']) . "</article>"; 
    } 
    include("includes/header.php"); 
    echo $pagecontent; 
    if(!$rawdata){ 
     error_404(); 
    } 
} 

感謝

回答

2

我討厭開關語句,但其個人偏好要誠實。至於進一步的優化,我建議看看某種形式的彙編語言。它會給你一些關於如何使條件語句更高效的一般想法。也就是說,它會給你一個不同的外觀。

if(!empty($_GET['id'])) 
    { 

    if($_GET['id'] == '13') 
    { 
     include('pages/servicestatus.php'); 
    } 
    else 
    { 
     $rawdata = fetch_article($db->real_escape_string($_GET['id'])); 

     if (!$rawdata) { 

      $title = ""; 
      $meta['keywords'] = ""; 
      $meta['description'] = ""; 
     } else { 

      $title = stripslashes($rawdata['title']); 
      $meta['keywords'] = stripslashes($rawdata['htmlkeywords']); 
      $meta['description'] = stripslashes($rawdata['htmldesc']); 
      $subs = stripslashes($rawdata['subs']); 
      $pagecontent = "<article>" . stripslashes($rawdata['content']) . "</article>"; 
     } 

     include("includes/header.php"); 
     echo $pagecontent; 
     if (!$rawdata) { 

      error_404(); 
     } 
    } 
} 
else 
{ 
    include('pages/home.php'); 
} 
2

你可能想看看你的代碼分解成一個MVC形式;這會讓維護代碼變得更容易。至少把最後一個子句放到另一個文件中,大概叫做default.phpinclude吧。另外,您可以創建一個id =>文件鍵/值集的數組,查找id幷包含文件。

if (isset($_GET['id'])) { 
    $pages = array(
     0 => 'home.php', 
     13 => 'servicestatus.php' 
    ); 
    if (isset($pages[$_GET['id']])) { 
     include('pages/' . $pages[$_GET['id']]); 
    } else { 
     include('pages/default.php'); 
    } 
} 
+0

盡我所願,代碼是內容管理系統的一部分,大部分內容是動態的。 :( – bear 2010-12-01 20:15:52

2

好吧,我不認爲這是必要切換到開關等 ,但你可以改變

} elseif (!empty($_GET['id'])) { 

只是,如果你有幾個離散

}else{ 
2

switch將是適當的您正在檢查的$_GET['id']的值。

一個建議我可以爲可讀性的原因是,

} elseif (!empty($_GET['id'])) { 

僅需要

} else { 
1

是,開關被評估一次,比if elseif高效,
是用此給定結構更容易維護

switch ($_GET['id']) 
{ 
    case 13: ... break; 
    case 0 : ... break; 
    default: ... break; 
} 
1

我不知道,如果你應該或不應該,但在這裏我不會。主要的原因是,至少有一個說法,你可以省略,然後,你將有隻是一個if-elseif-else語句來

if (empty($_GET['id'])) { /* code */ } 
elseif ($_GET['id'] === '13') { /* code */ } 
elseif (!empty($_GET['id'])) { /* code* } 

相同

if (empty($_GET['id'])) { /* code */ } 
elseif ($_GET['id'] === '13') { /* code */ } 
else { /* code* } 

在後擋那個聲明if(!$rawdata)也是重複的。

+0

應該或不應該?你應該總是試圖優化你的代碼,你的先生是「臃腫軟件」的主要原因之一 – 2010-12-01 20:49:48