Как правильно отступать PHP/HTML смешанный код?

При смешивании PHP и HTML, какой стиль следует использовать в качестве отступа? Я делаю отступ таким образом, чтобы выводимый HTML имел правильный отступ, или так, что сочетание PHP/HTML выглядело должным образом отформатированным (и, следовательно, его легче читать)?

Например, скажем, что у меня есть строки строк строки вывода foreach. Какой из них ниже?

Соединение PHP/HTML выглядит правильно:

<table>
  <?php foreach ($rows as $row): ?>
    <tr>
      <?php if ($row->foo()): ?>
        <?php echo $row ?>
      <?php else: ?>
        Something else
      <?php endif ?>
    </tr>
  <?php endforeach ?>
</table>

Выведенный HTML выглядит корректно:

<table>
<?php foreach ($rows as $row): ?>
  <tr>
  <?php if ($row->foo()): ?>
    <?php echo $row ?>
  <?php else: ?>
    Something else
  <?php endif ?>
  </tr>
<?php endforeach ?>
</table>

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

Ответ 1

Каждый PHP и HTML должны иметь отступ, чтобы они были правильны по отношению к себе в исходной форме независимо друг от друга и в виде формы:

<table>
<?php foreach ($rows as $row): ?>
    <tr>
    <?php if ($row->foo()): ?>
        <?php echo $row ?>
    <?php else: ?>
        Something else
    <?php endif ?>
    </tr>
<?php endforeach ?>
</table>

Ответ 2

Я тоже часто обдумывал этот вопрос, но потом я понял, кто заботится о том, как выглядит HTML-выход? Ваши пользователи не должны смотреть на ваш HTML в любом случае. Это для ВАС читать, и, может быть, пару других разработчиков. Держите исходный код как можно более чистым и забудьте о том, как выглядит вывод.

Если вам нужно отладить вывод, используйте инструменты разработчика Chrome, Firebug или даже инструменты F12.

Ответ 3

Я обычно помещаю открывающие теги php в начале строки, но отступы все внутри тегов соответствуют форматированию html. Однако я не делаю этого для простых выражений эха, поскольку я использую короткие теги. Я думаю, что это упрощает его при просмотре файла, чтобы найти все объявления.

    <table>
<?  foreach ($foo as $bar): ?>
      <tr>
<?    foreach ($bar as $baz): ?>

         <td><?=$baz?></td>

<?    endforeach ?>
      </tr>
<?  endforeach ?>
    </table>

Ответ 4

  • Прямой ответ на ваш вопрос: если вам нужно часто читать HTML-выход, неплохо бы вывести хорошо отступы HTML. Но более распространенным случаем будет то, что вам нужно прочитать исходный код php, поэтому важно, чтобы источник был легко читаемым.
  • Альтернатива двум указанным вами опциям: см. хаос или ответ tj111.
  • Лучше все еще на мой взгляд: не смешивайте HTML и php, используйте вместо этого механизм шаблонов.

Ответ 5

Вы всегда можете использовать немного пробелов, чтобы облегчить читаемость. Основываясь на отступе хаоса:

<table>

<?php foreach ($rows as $row): ?>

    <tr>

    <?php if ($row->foo()): ?>
        <?php echo $row ?>
    <?php else: ?>

        Something else

    <?php endif ?>

    </tr>

    <?php endforeach ?>

</table

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

Ответ 6

Вы не должны беспокоиться о отступке разметки в рабочей среде. Также вы не должны использовать Tidy или другие очистители HTML. Имеются допустимые варианты использования, например. когда вы разрешаете ввод HTML (но вместо этого используйте Markdown), хотя они встречаются редко.

Чаще всего фильтры HTML-фильтров злоупотребляют, чтобы скрыть основные проблемы с кодом. Не. Исправьте свою разметку вручную.

Если вам нужно отступывать свой код только в среде разработки, вы можете использовать любой из указанных выше. Однако будьте осторожны, что эти библиотеки попытаются исправить вашу разметку (что их основная цель, отступ является побочным продуктом). Я написал инструмент indentation, основанный на регулярном выражении Dindent.

Dindent преобразует разметку следующим образом:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <script>
    console.log('te> <st');
    function () {
        test; <!-- <a> -->
    }
    </script>
    <div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <div><table border="1" style="background-color: red;"><tr><td>A cell    test!</td>
<td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr> <td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr>
        <td><input><input><input></td></tr><tr><td>Cell</td><td>Cell</td><td>Ce
            ll</td></tr></table></td></tr><tr><td>Test <span>Ce       ll</span></td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div>
</body>
</html>

Для этого:

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <script>
    console.log('te> <st');
    function () {
        test; <!-- <a> -->
    }
    </script>
        <div>
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
            <div>
                <table border="1" style="background-color: red;">
                    <tr>
                        <td>A cell test!</td>
                        <td colspan="2" rowspan="2">
                            <table border="1" style="background-color: green;">
                                <tr>
                                    <td>Cell</td>
                                    <td colspan="2" rowspan="2"></td>
                                </tr>
                                <tr>
                                    <td>
                                        <input>
                                        <input>
                                        <input>
                                    </td>
                                </tr>
                                <tr>
                                    <td>Cell</td>
                                    <td>Cell</td>
                                    <td>Ce ll</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr>
                        <td>Test <span>Ce ll</span></td>
                    </tr>
                    <tr>
                        <td>Cell</td>
                        <td>Cell</td>
                        <td>Cell</td>
                    </tr>
                </table>
            </div>
        </div>
    </body>
</html>

Dindent не будет пытаться санировать или иным образом мешать вашему коду, кроме добавления отступа. Это упростит вашу разработку/отладку. Не для производства.