Вывод HTML с эхом считается плохой практикой в ​​PHP? - PullRequest
8 голосов
/ 30 ноября 2011

В PHP я использую оператор if, чтобы определить, вошел ли пользователь в систему или нет, и, в зависимости от результата, отображает главное меню (если вошел в систему) или сообщение «Вам необходимо войти» если не. Я делаю это так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <link rel="stylesheet" href="style.css" type="text/css" />
    <title>Home</title>
</head>
<body>
    <div id="header">
       <a href="index.php"><img src="wtcdblogo.png" alt="WTC DB logo" /></a>
    </div>
    <?php 
       if($_SESSION['loggedIn'] == 1) {
          echo "<div id='main'>MAIN MENU stuff goes here</div>";
       } else {
          echo "<div id='main'>Please login...</div>";
       } 
    ?>
</body>
</html>

Как видите, код для отображения главного меню или сообщения «Пожалуйста, войдите в систему» ​​создается echo. Это плохая практика, может быть, есть лучший способ?

Кстати, я вырезал большую часть HTML из echo в моем фрагменте выше. Главное меню состоит из списка, но я не стал его включать, я думаю, это не имеет отношения к вопросу.

Ответы [ 7 ]

27 голосов
/ 30 ноября 2011

Я считаю это плохой практикой. Не уверен, что кто-то еще думает. Во-первых, это выглядит ужасно в текстовых редакторах с подсветкой синтаксиса, тогда вам нужно беспокоиться о экранированных строках и т. Д.

Вот как я это делаю:

   <div>
      <? if ($_SESSION['loggedIn'] === 1): ?>
         <div id="main">Main Menu stuff goes here</div>
      <? else: ?>
         <div id="main">Please log in...</div>
      <? endif ?>
   </div>

Вы можете выбраться из тегов PHP и использовать прямой HTML. Есть плюсы и минусы, чтобы сделать это таким образом. Мне нравится это лучше, чем повторять. Другими вариантами будет создание новых представлений в этих областях на основе результатов операторов if. Множество возможностей, но вышеизложенное - лишь один из способов сделать это немного чище и (я думаю) лучше.

6 голосов
/ 30 ноября 2011

Нет ничего плохого в эхо для HTML, когда используется в модерации. Только не используйте его для длинных многострочных блоков. Вы неизменно получите некую уродливую конструкцию, требующую экранирования и еще много чего, что делает вещи еще более уродливыми.

Если html, который вы выводите, является «статическим» (нет переменных для вставки), тогда рассмотрите возможность выхода из режима php (?>) и просто сбросьте html как есть. Если вам нужно вставить переменные, рассмотрите возможность использования HEREDOC , который действует как строка в двойных кавычках, но без кавычек.

5 голосов
/ 30 ноября 2011

Почему бы не написать это так?

<?php if($_SESSION['loggedIn'] == 1): ?>
    <div id='main'>MAIN MENU stuff goes here</div>
<?php else: ?>
    <div id='main'>Please login...</div>
<?php endif; ?>

Использование альтернативных структур управления немного отделяет вашу разметку от кода.

3 голосов
/ 30 ноября 2011
<?php if (condition) { ?>
     <div> 
        some stuff
     </div> 
<?php } ?>

Прелесть PHP в том, что вы можете сделать это.

2 голосов
/ 30 ноября 2011

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

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

1 голос
/ 30 ноября 2011

Нет настоящей «лучшей практики», хотя некоторые утверждают, что предпочитают одно или другое. В идеале, если вы отделяете HTML от PHP, вы изолируете серверную часть своего приложения от внешнего интерфейса, что облегчает чтение, изменение и обслуживание.

Что касается вашего кода, я мог бы изменить его так, чтобы он был более кратким (в зависимости от того, что вы подразумеваете под «ГЛАВНОЕ МЕНЮ» ... Я бы пересмотрел это изменение):

<div id="main">
    <?= ($_SESSION['loggedIn'] == 1) ? 'MAIN MENU stuff goes here' : 'Please login...'; ?>
</div>
0 голосов
/ 30 ноября 2011

Некоторые считают это плохой практикой, это правда во всем. Мне нравится не использовать эхо. Если вы сделаете это таким образом, редакторам, таким как Dreamweaver, станет более понятно, что вы хотите, и получите все преимущества автозаполнения.

<?php
if ($loggedin)
{
?>
Thank you for being logged in. <hr>
<?php
}
else
{
?> 
Please <a href='login.php'>login</a>
<?php
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...