Warum in jeder Zeile <? Php und?>?

24

Ich habe diese Konvention so ziemlich überall gesehen, und manchmal ist es beinahe verrückt geworden:

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

Wobei die <?phpund schließend ?>in jeder einzelnen Zeile stehen, auch wenn kein dazwischenliegender HTML-Code vorhanden ist.

Meine Frage lautet: Warum? Warum all diese zusätzlichen Tags einschließen?

Mir scheint, diese Konvention fügt dem Code eine erhebliche Menge an Unordnung hinzu, es ist ärgerlich, sie zu befolgen, und sie fügt hinzu, dass viele weitere Stellen versehentlich ein öffnendes oder schließendes Tag weglassen.

HINWEIS

Dies ist Code aus dem Twenty-Twelve-Theme, das Beispiel von WordPress.

Indigenität
quelle
auch Kurzform while-Anweisungen = o
Tom J Nowell
3
Flagging zu schließen - es gibt keine definitive Antwort auf diese Frage, und es ist sicherlich kein WP spezifische Problem - jede Person mit PHP arbeiten wird dieses Problem konfrontiert
anu
3
@anu: Erstens hat eine Frage möglicherweise nicht immer eine eindeutige Antwort (obwohl sie immer noch die beste Antwort hat). In den Richtlinien heißt es "praktisch und verantwortungsbewusst". Zweitens, ja, dies ist technisch gesehen ein PHP-Problem, aber ich habe in meiner kurzen Zeit mit WP viel, viel mehr gesehen. Also, obwohl dies nicht auf WP beschränkt ist, scheint es mir korreliert genug zu sein, um in einer WP-Einstellung zu fragen.
Indigenuity

Antworten:

20

Dies wird in keinem WordPress-Styleguide empfohlen, und ich denke, es ist ein schlechter Codierungsstil. Anfänger verwenden diesen Stil, vielleicht weil er sich eher wie HTML anfühlt ...

Leider wird dieser Stil von den Standardthemen viel zu oft verwendet, sodass einige Anfänger glauben, dass er Teil eines Codestils ist.

Ein Nachteil dieses Stils ist die Behandlung von Kommentaren. Schauen Sie sich das folgende Beispiel genau an und wie es nicht das tut, was der Autor erwartet:

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

Viel Glück beim Debuggen. :)

Regel: Wechseln Sie nur dann zwischen PHP- und HTML-Kontext, wenn Sie eine Ausgabe in beiden Sprachen erstellen müssen. Verwenden Sie in allen anderen Fällen normale Zeilenumbrüche.

Update, weitere Gedanken: Jede gültige HTML-Datei ist ein vollständiges und gültiges PHP-Programm. Ja, auch wenn es keine einzige Zeile tatsächlichen PHP-Codes enthält.

Wenn Sie mit HTML beginnen und Schritt für Schritt kleine Teile von PHP hinzufügen, werden Sie möglicherweise den Stil finden, den wir hier diskutieren. Hier kommt das Refactoring ins Spiel: Wenn alles wie erwartet funktioniert, schreiben Sie den Code neu, bis er so gut wie möglich lesbar, leicht zu warten und zu erweitern ist, ohne Teile zu wiederholen.

Ich denke, einige Leute sind glücklich ohne diesen letzten Schritt, und deshalb wird dies nicht bald sterben.

fuxia
quelle
Schade, dass die Syntax-Hervorhebung oben nicht zeigt, was mit diesem Kommentar tatsächlich passiert ...
webaware
9
@webaware Ich denke das verdeutlicht das Problem noch mehr. :)
fuxia
True :) (plus ein paar Zeichen, um SE Kommentar Polizei glücklich zu machen)
webaware
2
@ AndyAdams Fair genug, ich habe das umformuliert. Und jetzt geh weg, du böser Empfehlung. :)
fuxia
3
Themen verwenden diesen Stil, weil es einfach zu hässlich ist, etwas anderes zu tun. Wenn ich Themen umgestalte, würde ich es vorziehen, den Code so lesbar wie möglich zu machen. Das bedeutet, dass ich nicht überall echo / printf / var_dump habe und jede Kontrollstruktur in eigene Paare setze <? ... ?>, um das Verschachteln verständlicher zu machen. Eine Sache, die ich anders machen würde als das Beispiel des OP, ist, dass ich the_post();eine eigene Linie aufstellen würde .
Lie Ryan
12

Während ich dies für PHP-Kommentare vermeide, bin ich ein begeisterter PHP-Öffner / Schließer in Vorlagendateien. Die Alternative ist das Echo von HTML über PHP-Strings, was meiner Meinung nach noch schlimmer aussieht. Als primitives Beispiel:

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

Ist Beispiel 2 ausführlicher? Vielleicht? Aber meiner Meinung nach einfacher zu lesen und zu bearbeiten. Sie können sich vorstellen, wie hässlich es bei komplexem HTML werden kann.

Auch nur als Randnotiz: Verwendung endforeachund endifbeim Schreiben von HTML zwischen PHP - Logik Verstärkt Lesbarkeit einer Tonne im Vergleich zu }.

Andy Adams
quelle
5
Der große Vorteil von }over ist endifjedoch, dass Sie (in vielen Editoren) leicht erkennen können, wo sich die Öffnung {befindet und ob daher alles ordnungsgemäß geschlossen wurde. Versuchen Sie, das mit endifund einer ganzen Reihe von Bedingungen herauszufinden ...
2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- zwei Zeilen, HTML und PHP gut getrennt. : P
fuxia
4
@toscho: Du hast den Punkt total verpasst. Sie mischen immer noch PHP und HTML. Leute, die den zweiten Stil bevorzugen, tun dies, weil wir vermeiden wollen, dass HTML in PHP-Zeichenfolgen enthalten ist. Ich benutze den zweiten Stil, wenn PHP als Template-Sprache verwendet wird, da dies die einzige Möglichkeit ist, eine Mischung aus PHP und HTML sinnvoll zu verschachteln, während ich den ersteren Stil verwende, wenn PHP als Skriptsprache verwendet wird, da es normalerweise keinen guten Grund gibt, HTML zu verwenden im Skript, wenn Sie die Anwendungslogik von der Vorlage trennen. Der zweite Stil wäre noch besser, wenn kurze Tags verfügbar wären: <? ... ?>und <?= ... ?>.
Lie Ryan
1
@ Piet: Wenn Sie Probleme beim Anpassen von Zahnspangen haben, haben Sie wahrscheinlich noch nie von Einrückungen gehört? Außerdem sollten Sie in der Lage sein, das Öffnen von endifin anständigen Editoren hervorzuheben .
Lie Ryan
4
@LieRyan Sei nett.
Rarst
10

Hier geht es um die Wahl zwischen dem Anzeigen der Seite als:

  • als vollständig PHP-generierte Entität
  • als HTML-Dokumentvorlage, unterstützt von PHP-Template-Tags

Verschiedene Leute neigen dazu, anders darüber zu denken. Beachten Sie, dass Funktionen diesen Stil selten verwenden, da sie sich eher wie reine PHP-Blöcke anfühlen. Auf der anderen Seite ist dies bei Vorlagen nicht ungewöhnlich, da sie über mehrere Dateien verteilt sind und die Menge an reinem HTML leicht höher sein kann als die von PHP.

Wenn Sie sich Vorlagen für Engines (Moustache, Twig usw.) ansehen, sehen sie diesem Stil sehr ähnlich, mit der Ausnahme, dass ihre Syntax dazu neigt, die Ausführlichkeit von einfachem PHP zu eliminieren.

PS: Ich möchte darauf hinweisen, dass es sich um eine vernünftige Einbettung von PHP in HTML handelt, und nicht um das wörtliche Öffnen und Beenden von Tags in jeder Zeile.

Rarst
quelle
2

Meine Frage lautet: Warum? Warum all diese zusätzlichen Tags einschließen?

Die Antwort ist ziemlich einfach: Publikum. Wenn Leute (keine Programmierer) ein Thema greifen, dann fühlen sich FTP-Ups ihrer Installation, das Ausführen des 5-Minuten-Setups und so weiter schon danach, für sie zu programmieren. Wenn sie dann eine einzelne Zeile eines beliebigen Themas hinzufügen oder ändern möchten , haben sie möglicherweise bereits herausgefunden, was HTML ist. PHP wird immer noch weit außerhalb ihrer Reichweite sein. Ich vermute also, dass die Idee dahinter ist, das Hinzufügen oder Entfernen von Elementen zu vereinfachen, ohne dass bei Fehlern alles kaputt geht.

Hinweis: Dies ist nicht das, was ich mag, bevorzuge oder empfehlen würde. Es ist genau das, was ich denke, warum dies passiert.

Kaiser
quelle
0

Ich habe festgestellt, dass einige neue Programmierer auf diese Weise ausgebildet werden. Ich folge einem 40-stündigen Kurs über Lynda und der Kursleiter löscht PHP-Tags in jeder Zeile, mit Ausnahme der Funktionsdefinitionen. Es ist wahrscheinlich, klare Linien zwischen HTML und PHP zu ziehen, was wahrscheinlich neuen Leuten hilft zu verstehen, wo HTML endet und PHP beginnt. Danach ist es wahrscheinlich eine Gewohnheit. Ich fing an, mich selbst darüber zu ärgern und beschloss zu sehen, ob sich jemand beschwerte.

Kitt Parker
quelle