Intereting Posts
PHP-анализ, обработка и преобразование некоторого объекта в stdClass JQUERY JSON возвратил неопределенные Вызов функции php в отдельном файле с использованием AJAX PHP по-прежнему не позволяет загружать файлы более 2 МБ Регулярное выражение для соответствия тегу HTML <p> с использованием PHP Как вызвать событие при оплате, полученное в пурпуре? Должен ли я отказаться от Adobe Flash для HTML5 и <canvas>? PHP – Как получить доступ к объекту pdo из других (нескольких) классов PHP и MYSQL: Query возвращает значение null в столбце со значениями Проблема с модульными расширениями HMVC для CodeIgniter URL-адрес запроса php, не дожидаясь ответа Создание php DLL из исходных файлов pecl Настроить и получить доступ к странице статуса PHP-FPM в стеке LAMP битмы Извлечь объект JSON внутри объекта JSON через php mysqli_query () возвращает «Таблица не существует» для известной таблицы – Разрешения выдаются?

php для многих elseif-заявлений более высокая производительность

Я писал сайт в 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; } 

Изменить: лучше писать в заголовке было немного вводить в заблуждение некоторых из вас, поэтому я ищу наилучшую производительность.

Это не слишком чище, но для этого лучше всего использовать коммутатор . Читаемость на 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; } 

Как насчет этого?

 $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; } } 

Предполагая, что $_GET содержит только те $_GET функции, которые вы можете сделать:

 foreach ($_GET as $key => $val){ if(isset($key)){ include_once 'template/template.'.$val.'.php'; break; } } 

Всего несколько мимолетных мыслей …

  • производительность здесь не проблема.
    Даже серия, if s sout else будет выполнена в течение нескольких микросекунд.

Тем не менее, важна надежность и надежность кода.

Я считаю, что немного хакерское использование переключателя несколько неудовлетворительное или даже опасное, потому что

  • важная информация (индекс GET и фактическое имя страницы) по-прежнему дублируется и зацикливается в глобусе повторяющегося кода,
  • переключатель будет вести себя странно, если одновременно будут выполняться два условия (я полагаю, что это займет первое удовлетворенное условие, но все же это не очень чисто)
  • добавление или удаление страницы по-прежнему требует дублирования / стирания 3 или 4 строк кода, и непреднамеренное дублирование блока может остаться незамеченным и поставить программиста в раздражающее «Я уверен, что этот вопрос был урегулирован (но на самом деле это не так) «ситуация.

На самом деле, интерфейс немного странный. Передача единственной «целевой» переменной, которая будет перечислять возможные страницы, кажется более последовательной для меня. Это устранит нечетные случаи, когда два флажка выбора страницы будут установлены одновременно.

Затем вы можете иметь простой список целей и либо вычислять имя целевых страниц, либо хранить их в массиве-ассоциированных (если вы действительно не можете назвать их согласованным образом, хотя мне интересно, какое странное требование может помешать вам делая это).

Ключевыми моментами, которые я хотел бы рассмотреть для обеспечения надежности, являются:

  • нет дублирования данных
  • нет «ленивого» случая по умолчанию (если значение по умолчанию не соответствует функциональному требованию)

По всем этим причинам я бы изменил способ выбора страницы, например:

 $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 

Вы можете использовать массив: если вы найдете ключ внутри, используйте его, иначе просто используйте значение по умолчанию:

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

Вы можете использовать переменную (например, t) в строке запроса, чтобы указать шаблон, который вы хотите использовать, а затем просто включить имя шаблона динамически на основе этого. Поэтому, если ваш URL-адрес выглядит примерно так: mysite.com/page.php?t=newsletter&blah=1 & …, тогда все, что вам нужно сделать, это:

 include_once('template/template.' . $_GET['t'] . '.php');