Ist es eine schlechte Praxis, <? = -Tag in PHP zu verwenden?

189

Ich bin vor <?= ?>kurzem auf dieses PHP-Tag gestoßen, und ich zögere, es zu verwenden, aber es juckt so stark, dass ich Ihre Meinung dazu haben wollte. Ich weiß, dass es eine schlechte Praxis ist, kurze Tags zu verwenden, <? ?>und dass wir <?php ?>stattdessen vollständige Tags verwenden sollten, aber was ist mit diesem <?= ?>:?

Es würde Tipparbeit ersparen und die Lesbarkeit des Codes verbessern, IMO. Also stattdessen:

<input name="someVar" value="<?php echo $someVar; ?>">

Ich könnte es so schreiben, was sauberer ist:

<input name="someVar" value="<?= $someVar ?>">

Ist die Verwendung dieses Operators verpönt?

Marco-Fiset
quelle
11
Das Problem bei dieser Art von Frage ist, dass sie so eigensinnig ist. Es gibt "technisch" keinen richtigen oder falschen Weg. Einige argumentieren für, andere dagegen. Am Ende liegt es also an Ihnen.
Mseancole
Vermeiden Sie das schließende Tag in irgendeiner Form, wenn Sie können - dh die Datei enthält nur PHP-Code (kein HTML usw.). Wenn Sie ein schließendes Tag haben, werden alle nachfolgenden Zeichen an den Browser ausgegeben (für eine Web-App) - was zu Problemen führen kann, die nur schwer zu beheben sind. Weitere Informationen
dharm0us
Nicht meinungsbezogen: Vorsicht, da dies echosehr leicht zu XSS führt und Sie sich besser auf die kontextbezogene Echomethode verlassen sollten (dh ein function html($x) { echo htmlentities($x,...); }und un html($someVar);anstelle von echo $someVaroder echo json_encode($x);für den JS-Kontext verwenden). Dies macht <?=Tags dann zu einer schlechten Praxis, da dies bedeutet, dass Sie den Variableninhalt an einer anderen Stelle mit HTML-Escapezeichen versehen haben und an einer anderen Stelle magisch wissen müssen, dass diese Variable mit HTML-Escapezeichen versehen sein muss, da sie im HTML-Kontext wiedergegeben wird.
Xenos

Antworten:

210

Geschichte

Bevor der Fehlinformationszug zu weit von der Station entfernt ist, gibt es eine Reihe von Dingen, die Sie über kurze PHP-Tags verstehen müssen.

Das Hauptproblem bei den kurzen Tags von PHP ist, dass PHP es geschafft hat, ein Tag ( <?) auszuwählen , das von einer anderen Syntax, XML, verwendet wurde .

Bei aktivierter Option konnte die XML-Deklaration nicht ohne Syntaxfehler ausgegeben werden:

<?xml version="1.0" encoding="UTF-8" ?>

Dies ist ein großes Problem, wenn Sie sich überlegen, wie häufig XML analysiert und verwaltet wird.

Was ist <?=?

Obwohl <?Ursachen Konflikte mit xml, <?= nicht . Unglücklicherweise waren die Optionen zum Ein- und Ausschalten damit verbunden short_open_tag, was bedeutete, dass <?=Sie sich mit den Problemen des kurzen offenen Tags ( <?) befassen mussten, um die Vorteile des kurzen Echo- Tags ( ) zu nutzen. Die mit dem Short-Open-Tag verbundenen Probleme waren weitaus größer als die Vorteile des Short-Echo-Tags, sodass Sie eineinhalb Millionen Empfehlungen finden short_open_tag, die Sie deaktivieren sollten .

In PHP 5.4 wurde jedoch das Kurz-Echo-Tag unabhängig von der short_open_tagOption wieder aktiviert . Ich sehe dies als eine direkte Bestätigung der Bequemlichkeit von <?=, da an und für sich nichts grundlegend Falsches daran ist.

Das Problem ist, dass Sie nicht garantieren können, dass dies der Fall ist, <?=wenn Sie versuchen, Code zu schreiben, der in einer größeren Anzahl von PHP-Versionen funktioniert.

ok, jetzt, wo das alles aus dem Weg ist

Solltest du verwenden <?=?

Flussdiagramm, ob das kurze Echo-Tag verwendet werden soll oder nicht

zzzzBov
quelle
70
Ich bin nicht einverstanden mit Ihrem bissigen Diagramm. Die richtige Antwort lautet 99,99% JA, da die meisten Produktionsumgebungen für die Verwendung kurzer Tags konfiguriert sind. Angenommen, Sie haben es ausgeblasen und es wird <?=in Zukunft entfernt. Sie können es in weniger als einer Minute reparieren, egal wie viele Tausend Dateien es verwenden. Sie führen einfach ein projektweites Suchen und Ersetzen von <?=durch <?php echo . Meine Antwort lautet: Mach dir keine Sorgen und nutze sie einfach , die Vorteile übersteigen die Konsequenzen erheblich. <?=Rasmus Lerdorf selbst hat das sehr engagiert.
Dukeofgaming
32
@dukeofgaming, woher beziehen Sie Ihre Daten zu Produktionsumgebungen, die für die Verwendung kurzer Tags konfiguriert sind? Das Deaktivieren ist eine der am häufigsten empfohlenen Konfigurationen, von denen ich gehört habe, nach dem Deaktivieren von magischen Anführungszeichen. Es wäre auch absolut sinnlos, eine Entwicklungsumgebung zu haben, die sich von der Produktion unterscheidet.
zzzzBov
4
Short-Tags waren standardmäßig bis 5.3 aktiviert. Php.net/manual/en/ini.core.php#ini.short-open-tag , die meisten Hosting-Dienste, die ich kenne, unterstützten es ohne Probleme, und dies war einer der Gründe für das Kohana-Framework verwendet, um es zu fördern. <?=wird immer eingeschaltet sein ( stackoverflow.com/a/6064813/156257 ) und die meiste Zeit waren sie eingeschaltet. Sie können mir das Gegenteil beweisen, indem Sie sich bei Ihrem Host erkundigen, ob: er deaktiviert ist und PHP <5.3 verwendet und die Einstellung nicht von Benutzern oder auf besonderen Wunsch überschrieben werden kann; Wenn alles Vorherige falsch ist, machen Sie sich auf jeden Fall Sorgen <?=.
dukeofgaming
6
Du machst dir keine Sorgen, dass <?=das entfernt wird, und ich auch nicht. Andere könnten es sein, und wenn sie es sind, müssen sie es nicht benutzen <?=. Einige Leute haben irrationale Angst vor der Verwendung bestimmter Sprachfunktionen ( wie das Weglassen von schließenden Tags in PHP ).
zzzzBov
8
Genau das ist mein Punkt: Es besteht kein Grund zur Sorge . Ich würde nur sagen "Bist du besorgt?" --yes -> "Mach weiter und benutze sie, es gibt keinen Grund zur Sorge". Es fühlt sich auch so an, als ob Sie andeuten, dass es eine schlechte Praxis ist, das Schließen von Tags zu unterlassen, was nicht der Fall ist.
dukeofgaming
28

Meinen PHP-Hut abstauben

Ich würde auf jeden Fall die Verwendung der <?= $someVar ?>ausführlicher echobevorzugen (einfach persönliche Präferenz). Der einzige Nachteil von AFAIK ist für Benutzer, die eine frühere Version short_open_tagals 5.4.0 verwenden . In diesem Fall muss AFAIK in der php.ini aktiviert sein .

Nun gesagt, wenn Ihr Projekt kein Betriebssystem ist, dann ist es ein strittiger Punkt. In diesem short_open_tagFall würde ich entweder die Tatsache dokumentieren, dass s aktiviert sein muss, oder die portablere der beiden Lösungen verwenden.

Demian Brecht
quelle
1
Nitpick: Auch wenn <?=durch nicht beeinflusst wird short_open_tagauf PHP 5.4, <?noch ist und wenn Sie eine Gewohnheit, mit Kurzform - Tags erhalten, ist es ganz einfach , zu vergessen , was auf welcher Version unterstützt wird .
Yannis
7
@YannisRizos Es ist gut zu unterscheiden zwischen <?="Ich gebe jetzt eine Variable aus" für die Verwendung im Vorlagenstil und <?php"Ich führe jetzt viel Code aus". Ich würde vorschlagen, nie zu verwenden <?, aber das beide <?=und <?phpsind in Ordnung.
Izkata
2
+1, weil Rasmus Lerdorf das Kürzel <? = Unterstützt. Ich habe einen seiner Vorträge über PHP 5.4 gesehen. Deshalb ist seit PHP 5.4.0 das Tag <? = Immer verfügbar. Ich habe eine Menge Code vor PHP 5.4 gesehen, dass das <? = -Tag in der Ansicht einer MVC-Anwendung verwendet wird, aber <? Php ...?> In den Nicht-Ansichtsdateien.
Programmierer
@ Jason Das ist nicht was ich sage. "Rasmus befürwortet foo" ist kein Argument, "Rasmus befürwortet foo aus diesem und jenem Grund" jedoch.
Yannis
2
@Yannis Rizos "Rasmus unterstützt foo aus diesem und jenem Grund" ist es jedoch. Vielen Dank für die Anleitung, aber meine Überlegung war, dass Rasmus Lerdorf sie unterstützt, da er der Schöpfer der Sprache ist und immer noch Einfluss auf die PHP-Entwicklung hat, Änderungen vorgenommen wurden, um das Tag <? = Immer verfügbar zu machen. Dies hätte ich zu meinem ursprünglichen Kommentar hinzufügen sollen: "Daher wird sich die Praxis der Verwendung von <? = In Ansichten wahrscheinlich noch weiter verbreiten." Verdammt, ich muss meine Kommentare für jetzt auf ... Punkte ... verdreifachen
Programmierer
21

Sie sollten auf jeden Fall versuchen, Kurzform-Tags zu vermeiden, egal ob sie es sind <?oder nicht <?=.

Der wichtigste technische Grund ist die Portabilität. Sie können nie sicher sein, dass die Kurzform-Tags für jedes Setup funktionieren, da sie deaktiviert werden können. Lesen Sie die short_open_tagDirektive. Aber Sie können immer absolut sicher sein, dass die lange Form überall funktionieren wird.

Es würde Tipparbeit ersparen und die Lesbarkeit des Codes verbessern, IMO.

Das ist auch eine schlechte Angewohnheit. Ich kann Ihnen nicht wirklich sagen, was Sie lesbarer finden, aber ich bin fieberhaft dagegen, die Lesbarkeit von Code als Ausrede zu verwenden, um sich ein paar Tastenanschläge zu ersparen. Wenn Sie sich Gedanken über die Lesbarkeit machen, sollten Sie sich für eine Vorlagen-Engine entscheiden:

<input name="someVar" value="{someVar}">

ist aus beiden Beispielen weitaus lesbarer.

Abschließend ist anzumerken, dass von großen PHP-Projekten wie PEAR und Zend Framework Short Form-Tags ausdrücklich abgeraten werden .

yannis
quelle
14
+1 für Vorlagen. -1 für die Portabilität. Es ist eine serverseitige Sprache. Herausforderungen, auf die Sie sich bei einem Server konzentrieren müssen, sind beispielsweise Skalierbarkeit und Sicherheit. Es wäre eine erstaunlich schlechte Idee, ernsthafte Zeit in die
Sicherstellung
3
@ Stargazer712 Hm? Das einzige, was Sie tun müssen, ist den Standard zu verwenden <?phpund echoanstelle von <?und <?=, zählen Sie das als ernsthafte Zeit? Und was passiert, wenn Sie Ihr Projekt auf einen Server verschieben, auf dem kurze Tags aus irgendeinem Grund deaktiviert sind?
Yannis
13
@Yannis: Diese wenigen Charaktere scheinen nicht viel zu sein, aber IMO summieren sie sich zu viel Lärm.
Kevin Cline
8
Ich denke, es sollte erwähnt werden, dass der ursprüngliche Zweck von PHP darin bestand, eine Vorlagensprache zu sein . Das Hinzufügen einer weiteren Template-Engine (mehr Schwung) über PHP bringt mein Thunfischboot nicht zum schweben. Befolgen Sie einfach die bewährten Methoden (einige gute Tipps finden Sie hier: stackoverflow.com/questions/62617/… ), wenn Sie PHP mit HTML mischen, und Sie können loslegen .
Programmierer
2
@Yannis Rizos Ja, dies sollte erwähnt werden, da PHP-Neulinge glauben, dass sie verpflichtet sind, die [whizbang] -Vorlagen-Engine in ihren PHP-Projekten zu verwenden, ohne die Verwendung von reinem PHP in Betracht zu ziehen. Sollte ich nur Text in Perl verarbeiten , vielleicht auch nicht, aber ich denke , dass Perl mittlerweile ziemlich gut in der Textverarbeitung ist - ebenfalls mit PHP und Templating.
Programmierer
15

In der PHP-Dokumentation steht eindeutig, dass Sie kurze Echo-Tags sicher verwenden können:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Dies ist zwar für PHP-Version 5.4 und höher, aber jeder sollte zumindest diese verwenden. Ich würde sie nur zu Vorlagenzwecken bevorzugen.

Hexodus
quelle
10

Gründe für die Verwendung kurzer Tags:

  • Sie sind kürzer.

Gründe für die nicht kurz - Tags:

  • Sie führen eine weitere Konfigurations-Gotcha ein - während Sie den Server die meiste Zeit in einem professionellen Kontext kontrollieren, können kurze Tags für Benutzer, die sie beispielsweise auf gemeinsamem Hosting verwenden, irreparabel sein, wenn Sie vorhaben, Ihren Code für die Öffentlichkeit freizugeben .
  • Sie machen es viel zu einfach, nicht bereinigte Zeichenfolgen in Ihre Ausgabe zu kopieren. Dies ist beängstigend, da es zu XSS-Sicherheitslücken kommen kann. Lange Tags tun zwar nichts direktes, um dies zu verhindern, signalisieren dem Programmierer jedoch, dass das, was sie tun, möglicherweise nicht das Richtige ist, und sie sollten ein Vorlagensystem verwenden, das die HTML-Codierung für sie jetzt automatisch handhabt . Die Ausgabe dynamischer Zeichenfolgen mit langen Tags ist schmerzhaft, was eine gute (lehrreiche) Sache ist.
tdammers
quelle
Das ist die Antwort, um IMO zu akzeptieren, auch wenn Vorlagen nicht alles XSS-sicher machen (Benutzerdaten im src-Attribut eines Skripts sind immer unsicher), und ich weiß nicht, ob der Vorlagenmechanismus den richtigen Echokontext kennt. Was passiert, wenn die PHP-Variable in einem Skript-Tag-Inhalt endet? In eine SVG im HTML eingebettet?
Xenos
@ Xenos klar, das hängt von dem Template-System in Frage, und es gibt keine Silberkugel; Die meisten von ihnen reduzieren jedoch die Fehleroberfläche und die Anzahl der Szenarien, in denen manuelle Sorgfalt (die wichtigste Quelle für Sicherheitsfehler) erforderlich ist. "Dynamischen Inhalt nicht in Skript-Tags einfügen" ist einfacher zu befolgen (und zu überprüfen) als "sicherzustellen, dass der gesamte dynamische Inhalt überall ordnungsgemäß HTML-codiert ist".
Tdammers
4

Ich denke, dass die <?=Version eine gute / akzeptable Praxis ist, vorausgesetzt, Sie verwenden sie nur für die endgültige Ausgabe von Variablen und vermeiden Funktionsaufrufe oder ternäre Logik, die nicht direkt mit der Darstellung der Daten zusammenhängen.

Es ist sicherlich viel besser als <? echo($x); ?>überall.

Langfristig sollten Sie sich mit Vorlagenmodulen wie Smarty befassen .

Darien
quelle
3
Smarty war einst die Template-Engine, aber jetzt ist es ein veraltetes und aufgeblähtes Durcheinander, und Sie sollten wirklich klar steuern.
Yannis
2

Ab PHP 7.4 ändert sich das Spielfeld etwas:

<? ?> ist offiziell veraltet und wird in PHP 8.0 entfernt.

PHP RFC: Veraltete PHP Short Open Tags geben explizit an, dass dies nicht <?= ?>betroffen ist. Dies würde (meiner Meinung nach, nicht der RFC) anzeigen, dass von seiner Verwendung nicht abgeraten wird.

Etienne Bruines
quelle
-3

Um ehrlich zu sein, denke ich, dass es ziemlich veraltet ist, ein Ergebnis zu wiederholen, egal welche Methode (alt oder neu), während MVC bereits 33 Jahre alt ist.

Ich würde sagen, ja, dies ist eine gute Vorgehensweise, um die eingehenden Server- (PHP-) Daten in einem XML-Dokument zu kapseln und in Ihrer Anwendungs- / Client-Ebene zu verarbeiten. Auf diese Weise ersparen Sie sich sogar die Idee, ein solches Tag zu verwenden.

sebas
quelle
1
Eigentlich feiert MVC 33 Jahre, es wurde erstmals im Dezember 1979 in diesem Papier skizziert .
Yannis
Ja, ich bin immer noch im Jahr 2000, mein Fehler :-)
Sebas
1
ähm ... Templating ... ist Templating veraltet? Schablonen und MVC schließen sich gegenseitig aus?
Tim Seguine