Dlaczego <? Php i?> W każdej linii

24

Prawie wszędzie widziałem tę konwencję i czasami zbliża mnie to do doprowadzenia mnie do szału:

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

Gdzie <?phpi zamknięcie ?>znajduje się w każdym wierszu, nawet jeśli nie ma interweniującego kodu HTML.

Moje pytanie brzmi: dlaczego? Dlaczego warto uwzględnić wszystkie te dodatkowe tagi?

Wydaje mi się, że ta konwencja dodaje znacznej ilości bałaganu do kodu, jest przede wszystkim denerwująca i dodaje, że o wiele więcej miejsc przypadkowo pomija tag otwierający lub zamykający.

UWAGA

Jest to kod pobrany z motywu Dwadzieścia Dwanaście, przykład podany przez WordPress.

Indigencja
źródło
również skróty while oświadczenia = o
Tom J Nowell
3
Oznaczanie aby zamknąć - nie ma jednoznacznej odpowiedzi na to pytanie, a to na pewno nie jest WP specyficzny problem - każda osoba pracująca z PHP napotka ten problem
Anu
3
@anu: Po pierwsze, pytanie nie zawsze może mieć jedną, ostateczną odpowiedź (choć nadal może mieć najlepszą odpowiedź). Wytyczne mówią „praktyczny i odpowiedzialny”. Po drugie, tak, jest to technicznie problem z PHP, ale widziałem o wiele więcej w krótkim czasie pracy z WP. Tak więc, chociaż nie jest to ograniczone do WP, wydaje mi się, że jest wystarczająco skorelowane, aby zapytać w ustawieniu WP.
Indigenuity,

Odpowiedzi:

20

Nie jest to zalecane w żadnym przewodniku po stylu WordPress i myślę, że jest to zły styl kodowania. Początkujący używają tego stylu, może dlatego, że bardziej przypomina HTML…

Niestety, domyślne motywy zbyt często używają tego stylu, więc niektórzy początkujący mogą pomyśleć, że jest to część stylu kodu.

Wadą tego stylu jest obsługa komentarzy. Przyjrzyj się uważnie poniższemu przykładowi i temu, że nie robi tego, czego autor może się spodziewać:

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

Powodzenia w debugowaniu tego. :)

Reguła: Przełączaj między kontekstem PHP i HTML tylko wtedy, gdy musisz utworzyć dane wyjściowe w obu językach. Używaj regularnych podziałów linii we wszystkich innych przypadkach.

Aktualizacja, dalsze przemyślenia: Każdy prawidłowy plik HTML jest kompletnym i poprawnym programem PHP. Tak, nawet jeśli nie zawiera ani jednego wiersza rzeczywistego kodu PHP.

Jeśli zaczniesz od HTML i dodasz małe fragmenty PHP krok po kroku… możesz skończyć ze stylem, o którym tutaj rozmawiamy. W tym momencie w grę wchodzi refaktoryzacja : gdy wszystko działa zgodnie z oczekiwaniami, przepisz kod, aż będzie tak czytelny, jak to możliwe, łatwy w utrzymaniu i rozszerzaniu, bez powtarzania części.

Myślę, że niektórzy ludzie są szczęśliwi bez tego ostatniego kroku i dlatego wkrótce nie umrze.

fuxia
źródło
Szkoda, że ​​powyższe wyróżnienie składni nie pokazuje, co faktycznie dzieje się z tym komentarzem ...
webaware
9
@webaware Myślę, że to jeszcze bardziej ilustruje problem. :)
fuxia
To prawda :) (plus kilka znaków, aby policja z SE skomentowała szczęśliwy)
webara
2
@AndyAdams Uczciwie, sformułowałem to. A teraz odejdź, zły z polecenia. :)
fuxia
3
Motywy używają tego stylu, ponieważ robienie inaczej jest po prostu zbyt brzydkie. Podczas refaktoryzacji motywów wolałbym przepisać kod tak, aby był jak najbardziej czytelny, a to oznacza, że ​​nie ma dookoła echa / printf / var_dump i umieszcza każdą strukturę kontrolną w swoich parach, <? ... ?>aby ułatwić zagnieżdżanie. Jedną rzeczą, którą zrobiłbym inaczej niż w przykładzie PO, jest to, że postawiłem the_post();własną linię.
Lie Ryan,
12

Chociaż unikam tego w komentarzach PHP, jestem zapalonym otwieraczem PHP / bliżej w plikach szablonów. Alternatywą jest echo HTML za pomocą ciągów PHP, co moim zdaniem wygląda jeszcze gorzej. Jako prymitywny przykład:

<!-- 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>

Czy przykład 2 jest bardziej szczegółowy? Być może? Ale moim zdaniem łatwiejsze do odczytania i edycji. Możesz sobie wyobrazić, jak brzydka może być dla złożonego HTML.

Dodatkowo, na marginesie: używanie endforeachi endifpisanie HTML między logiką PHP poprawia czytelność o tonę w porównaniu do }.

Andy Adams
źródło
5
ogromna zaleta }ciągu endifjednak jest to, że (w wielu edytorów) można łatwo zobaczyć, gdzie otwór {jest, a zatem, czy wszystko zostało prawidłowo zamknięte. Spróbuj to endif
2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- dwie linie, HTML i PHP ładnie rozdzielone. : P
fuxia
4
@toscho: Całkowicie przegapiłeś ten punkt. Wciąż mieszasz PHP i HTML, ludzie, którzy preferują drugi styl, robią to, ponieważ chcemy uniknąć HTML w łańcuchu PHP. Używam drugiego stylu, używając PHP jako języka szablonów, ponieważ jest to jedyny sposób rozsądnego zagnieżdżenia mieszanki PHP i HTML, podczas gdy używam tego pierwszego, gdy używam PHP jako języka skryptowego, ponieważ zwykle nie ma dobrego powodu, aby mieć HTML w skrypcie po oddzieleniu logiki aplikacji od szablonu. Drugi styl byłby jeszcze lepszy, gdyby dostępne były krótkie tagi: <? ... ?>i <?= ... ?>.
Lie Ryan,
1
@Piet: jeśli masz problemy z dopasowaniem aparatu, prawdopodobnie nigdy nie słyszałeś o wcięciu? Ponadto powinieneś być w stanie skonfigurować, aby wyróżnić otwarcie endifw dowolnym przyzwoitym edytorze.
Lie Ryan,
4
@LieRyan Bądź miły.
Rarst
10

Chodzi o wybór między wyświetlaniem strony jako:

  • jako całość generowana przez PHP
  • jako szablon dokumentu HTML, obsługiwany przez tagi szablonu PHP

Różni ludzie zwykle myślą o tym inaczej. Pamiętaj, że funkcje rzadko używają tego stylu, ponieważ bardziej przypominają blok czystego PHP. Z drugiej strony szablony nie są rzadkie, ponieważ są one bardziej rozłożone na pliki, a ilość czystego HTML może być z łatwością większa niż w przypadku PHP.

Jeśli spojrzysz na silniki szablonów (Mustache, Twig itp.) - wyglądają bardzo podobnie do tego stylu, z wyjątkiem tego, że ich składnia eliminuje gadatliwość zwykłego PHP.

PS Chcę zauważyć, że mówię o rozsądnym osadzaniu PHP w HTML, a nie o dosłownie otwieranie i kończenie znaczników w każdej linii tylko ze względu na to.

Rarst
źródło
2

Moje pytanie brzmi: dlaczego? Dlaczego warto uwzględnić wszystkie te dodatkowe tagi?

Odpowiedź jest dość prosta: publiczność. Gdy ludzie (nie programiści) chwytają motyw, a następnie przesyłając FTP na swoją instalację, uruchamiając konfigurację 5min i tak dalej, wydaje się, że programuje. Kiedy następnie chcą dodać lub zmienić jeden wiersz dowolnego motywu, być może już zorientowali się, czym jest HTML. PHP wciąż będzie poza ich zasięgiem. Sądzę więc, że ideą tego jest umożliwienie łatwiejszego dodawania lub usuwania elementów bez przerywania wszystkiego, gdy popełniają błąd.

Uwaga: to nie jest to, co lubię, wolę lub polecam. Myślę, dlaczego tak się dzieje.

kajzer
źródło
0

Przekonałem się, że niektórzy nowi programiści są szkoleni w ten sposób. Uczęszczam na 40-godzinny kurs na temat Lyndy, a instruktor upuszcza tagi PHP w każdej linii, z wyjątkiem definicji funkcji. Prawdopodobnie jest to wyraźne rysowanie linii między HTML a PHP, co prawdopodobnie pomaga nowym ludziom zrozumieć, gdzie kończy się HTML, a zaczyna PHP. Po tym prawdopodobnie jest to nawyk. Zaczynałem się tym denerwować i postanowiłem sprawdzić, czy ktoś jeszcze narzeka.

Kitt Parker
źródło