优化PHP If / Else语句

时间:2010-12-01 20:01:41

标签: php optimization case if-statement

我正在尝试优化以下PHP If / Else语句。我可以重写代码以使用caseswitch,还是应该保留原样,或者是什么?

代码:

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();
    }
}

由于

6 个答案:

答案 0 :(得分:2)

您可能希望将代码分解为MVC表单;这将使维护代码变得更容易。至少将最后一个子句放入另一个文件中,可能称为default.phpinclude。此外,您可以创建一个id =&gt;的数组。文件键/值集,查找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');
    }
}

答案 1 :(得分:2)

嗯,我认为没有必要改用开关 但你可以改变

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

}else{

答案 2 :(得分:2)

如果您要检查的switch有多个离散值,则

$_GET['id']是合适的。

为了便于阅读,我可以提出一个建议

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

只需要

} else {

答案 3 :(得分: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');
}

答案 4 :(得分:1)

是的,开关评估一次,效率高于if elseif
并且使用这个给定的结构更容易维护

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

答案 5 :(得分: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)也是重复的。