Почему <? Php и?> На каждой строке


24

Я видел это соглашение почти везде, и иногда оно почти сводило меня с ума:

<?php //The loop ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

Где <?phpи закрытие ?>на каждой строке, даже если нет HTML-кода.

Мой вопрос: почему? Зачем включать все эти дополнительные теги?

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

НОТА

Этот код взят из темы «Двадцать двенадцать», пример, приведенный в WordPress.


Кроме того, стенограммы в то время как заявления = o
Том J Nowell

3
Пометка для закрытия - нет однозначного ответа на этот вопрос, и, конечно, это не специфическая проблема WP - любой человек, работающий с PHP, столкнется с этой проблемой
anu

3
@anu: Во-первых, вопрос может не всегда иметь однозначный ответ (хотя он все же может иметь лучший ответ). В руководящих принципах говорится «практично и ответственно». Во-вторых, да, технически это проблема PHP, но я видел это намного больше за короткое время работы с WP. Таким образом, хотя это не ограничивается WP, мне кажется, что это достаточно коррелирует, чтобы спрашивать в настройках WP.
Indigenuity

Ответы:


20

Это не рекомендуется в любом руководстве по стилю WordPress, и я думаю, что это плохой стиль кодирования. Новички используют этот стиль, возможно потому, что он больше похож на HTML…

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

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

<?php echo 'Important: '; // announcement ?>
<?php echo ' enter the word '; /* start ?>
<?php echo '<b>password</b>'; /* the end */ ?>

Удачи в отладке этого. :)

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

Обновление, дальнейшие размышления: каждый действительный HTML-файл является полноценной и действующей программой PHP. Да, даже если он не содержит ни одной строки реального кода PHP.

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

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


Жаль, что приведенная выше подсветка синтаксиса не показывает, что на самом деле происходит с этим комментарием ...
webaware

9
@webaware Я думаю, что это иллюстрирует проблему еще больше. :)
fuxia

Правда :) (плюс несколько символов, чтобы полиция
оставляла

2
@ AndyAdams Справедливо, я перефразировал это. А теперь уходи, ты, злой советчик. :)
fuxia

3
Темы используют этот стиль, потому что делать иначе слишком уродливо. При рефакторинге тем я бы предпочел переписать код так, чтобы он был как можно более читабельным, а это означает, что в нем нет echo / printf / var_dump, и чтобы каждая структура управления была помещена в свои собственные пары, <? ... ?>чтобы облегчить понимание вложения. Хотя я бы поступил иначе, чем в примере с ОП, - это то, что я поставил бы the_post();свою собственную линию.
Ли Райан

12

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

<!-- Example 1 -->
<ul>
    <?php
        foreach ( $list_items as $list_item ) {
            echo "<li><a href='" . $list_item->url . "'>" . $list_item->name . "</a></li>";
        }
    ?>
</ul>

<!-- Example 2 -->
<ul>
    <?php foreach ( $list_items as $list_item ) : ?>
        <li>
            <a href="<?php echo $list_item->url; ?>">
                <?php echo $list_item->name; ?>
            </a>
        </li>
    <?php endforeach; ?>
</ul>

Пример 2 более многословен? Может быть? Но проще читать и редактировать, на мой взгляд. Вы можете себе представить, насколько уродливым он может стать для сложного HTML.

Кроме того , так же , как примечание стороны: с помощью endforeachи endifпри написании HTML между PHP логики улучшает читаемость на тонну по сравнению с }.


5
однако огромное преимущество }перед ними endifзаключается в том, что (во многих редакторах) вы можете легко увидеть, где находится отверстие {и, следовательно, все ли правильно закрыто. Попробуйте выяснить это с endifпомощью целой связки условных

2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- две строки, HTML и PHP красиво разделены. : P
fuxia

4
@toscho: Вы полностью упустили суть. Вы все еще смешиваете PHP и HTML, люди, которые предпочитают второй стиль, делают это, потому что мы хотим избежать HTML внутри строки PHP. Я использую второй стиль при использовании PHP в качестве языка шаблонов, потому что это единственный способ разумно вкладывать смесь PHP и HTML, в то время как я использую первый при использовании PHP в качестве языка сценариев, потому что обычно нет веской причины иметь HTML в сценарии, когда вы отделяете логику приложения от шаблона. Второй стиль будет еще лучше, если будут доступны короткие теги: <? ... ?>и <?= ... ?>.
Ли Райан

1
@Piet: если у вас есть проблемы с подбором брекетов, вы, вероятно, никогда не слышали об отступах? Кроме того, вы должны быть в состоянии настроить подсветку открытия endifв любых приличных редакторах.
Ли Райан


10

Это о выборе между просмотром страницы как:

  • как полностью сгенерированный PHP объект
  • как шаблон документа HTML, работает с тегами шаблона PHP

Разные люди склонны думать об этом по-разному. Обратите внимание, что функции редко используют этот стиль, потому что они больше похожи на блок чистого PHP. С другой стороны, это не редкость в шаблонах, потому что они более распространены по файлам, и количество чистого HTML может быть намного больше, чем в них в PHP.

Если вы посмотрите на движки шаблонов (Mustache, Twig и т. Д.) - они очень похожи на этот стиль, за исключением того, что их синтаксис имеет тенденцию устранять многословность простого PHP.

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


2

Мой вопрос: почему? Зачем включать все эти дополнительные теги?

Ответ довольно прост: аудитория. Когда люди (не программисты) берут тему, тогда FTP загружает их установку, запускает настройку 5 минут и так далее, уже похоже на программирование для них. Когда они после этого хотят , чтобы добавить или изменить одну строку любой другой в своей теме, то они , возможно , уже поняли, что HTML является. PHP все еще будет далеко за пределами их досягаемости. Поэтому я предполагаю, что идея заключается в том, чтобы упростить добавление или удаление элементов, не нарушая ничего, когда они совершают ошибку.

Примечание: это не то, что я люблю, предпочитаю или рекомендую. Это то, что я думаю, почему это происходит.


0

Я обнаружил, что некоторые новые программисты обучаются таким образом. Я прохожу 40-часовой курс по Линде, и инструктор сбрасывает теги PHP на каждой строке, за исключением определений функций. Вероятно, он четко рисует линии между HTML и PHP, что, вероятно, помогает новым людям понять, где заканчивается HTML и начинается PHP. После этого это, вероятно, привычка. Я сам начинал раздражаться и решил посмотреть, жалуется ли кто-нибудь еще.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.