Оптимизация оператора PHP If / Else - PullRequest
3 голосов
/ 01 декабря 2010

Я пытаюсь оптимизировать следующий оператор PHP If / Else. Могу ли я переписать код для использования в case и switch, или я должен оставить его как есть, или как?

Код:

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 ]

2 голосов
/ 01 декабря 2010

Я ненавижу заявления о смене, но это личное предпочтение, если честно.Что касается дальнейшей оптимизации, я бы посоветовал взглянуть на некоторую форму языка ассемблера.Это даст вам некоторые общие идеи о том, как сделать условные выражения более эффективными.То есть это даст вам другой взгляд на вещи.

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 голосов
/ 01 декабря 2010

switch было бы целесообразно, если бы у вас было несколько дискретных значений для $_GET['id'], которые вы проверяли.

Одно предложение, которое я могу сделать для удобства чтения, состоит в том, что

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

должно быть только

} else {
2 голосов
/ 01 декабря 2010

Ну, я не думаю, что нужно переключаться на swith, но вы можете изменить

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

на

}else{
2 голосов
/ 01 декабря 2010

Возможно, вы захотите разобрать ваш код в форму MVC;это сделало бы намного проще поддерживать ваш код.По крайней мере, поместите последнее предложение в другой файл, вероятно, с именами default.php и include it.Кроме того, вы можете создать массив наборов ключей и значений id => file, найти идентификатор и включить файл.

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 голос
/ 01 декабря 2010

Я не знаю, если вы должны или не должны, но здесь я бы не стал.Основная причина в том, что есть хотя бы одно утверждение, которое вы можете опустить, и тогда у вас будет просто if-elseif-else -Statement

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) также дублируется.

1 голос
/ 01 декабря 2010

Да, коммутатор оценивается один раз, эффективнее if elseif,
и легче поддерживать с этой данной структурой

switch ($_GET['id'])
{
  case 13: ... break;
  case 0 : ... break;
  default: ... break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...