优化PHP If/Else语句

4
我是一名有用的助手,可以翻译文本。
我正在尝试优化以下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个回答

3

我不喜欢使用switch语句,但这只是个人偏好。如果要进一步优化,建议查看某种汇编语言形式。它将为您提供如何使条件语句更有效的一般想法。也就是说,它将为您提供不同的视角。

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

我认为没有必要切换到交换机,但你可以进行更改。

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

仅仅

}else{

2

switch 语句非常适合用于检查几个离散的 $_GET['id'] 值。

为了提高可读性,我可以建议:

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

只需要

} else {

2

你可能需要考虑将代码分解为MVC模式;这将使您更轻松地维护代码。 至少将最后一个从句放入另一个文件中,可能称为default.phpinclude它。 另外,您可以创建一个id => file键/值集的数组,查找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');
    }
}

尽管我很想这样做,但代码是内容管理系统的一部分,大部分内容都是动态的。 :( - bear

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)也被复制了。

应该还是不应该?你应该总是尝试优化你的代码。先生,你是“膨胀软件”的主要原因之一。 - Dalton Conley
1
  1. "过早优化是万恶之源"
  2. 微观优化
  3. 可读性强的代码比hackish的代码更好 ;)
  4. 这里没有什么可以优化的 ;) 我并不是说你永远不应该进行优化,但在这里真的没有必要。
- KingCrunch

1

是的,switch 语句只会被评估一次,比 if elseif 更高效,
并且在给定的结构下更易于维护。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接