Ich lese weiter, es ist eine schlechte Praxis, das PHP-Close-Tag ?>
am Ende der Datei zu verwenden. Das Header-Problem scheint im folgenden Kontext irrelevant zu sein (und dies ist das einzig gute Argument bisher):
Moderne Versionen von PHP setzen das Flag output_buffering in php.ini. Wenn die Ausgabepufferung aktiviert ist, können Sie nach der Ausgabe von HTML HTTP-Header und -Cookies setzen, da der zurückgegebene Code nicht sofort an den Browser gesendet wird.
Jedes gute Übungsbuch und Wiki beginnt mit dieser „Regel“, aber niemand bietet gute Gründe. Gibt es einen weiteren guten Grund, das endende PHP-Tag zu überspringen?
php
security
http-headers
Danidacar
quelle
quelle
?>
ist?Antworten:
Das Senden von Headern vor dem normalen Kurs kann weitreichende Konsequenzen haben. Im Folgenden sind nur einige davon aufgeführt, die mir gerade in den Sinn gekommen sind:
Während in aktuellen PHP-Versionen möglicherweise die Ausgabepufferung aktiviert ist, sind die tatsächlichen Produktionsserver, auf denen Sie Ihren Code bereitstellen , weitaus wichtiger als alle Entwicklungs- oder Testmaschinen. Und sie tendieren nicht immer dazu, den neuesten PHP-Trends sofort zu folgen.
Möglicherweise haben Sie Kopfschmerzen wegen unerklärlichen Funktionsverlusts . Angenommen, Sie implementieren eine Art Zahlungsgateway und leiten den Benutzer nach erfolgreicher Bestätigung durch den Zahlungsprozessor zu einer bestimmten URL weiter. Wenn ein PHP-Fehler, sogar eine Warnung oder ein übermäßiges Zeilenende auftritt, bleibt die Zahlung möglicherweise unverarbeitet und der Benutzer scheint immer noch nicht in Rechnung gestellt zu sein. Dies ist auch einer der Gründe, warum unnötige Umleitung böse ist und wenn Umleitung verwendet werden soll, muss sie mit Vorsicht verwendet werden.
In Internet Explorer werden möglicherweise Fehler vom Typ "Seitenladen abgebrochen" angezeigt, selbst in den neuesten Versionen. Dies liegt daran, dass eine AJAX- Antwort / ein JSON-Include etwas enthält, das sie nicht enthalten sollte, da in einigen PHP-Dateien überschüssige Zeilenenden vorhanden sind, wie ich es vor einigen Tagen erlebt habe.
Wenn Ihre App einige Dateidownloads enthält , können diese aus diesem Grund ebenfalls beschädigt werden. Und Sie werden es vielleicht auch nach Jahren nicht bemerken, da die spezifische Abbruchgewohnheit eines Downloads vom Server, dem Browser, dem Typ und dem Inhalt der Datei abhängt (und möglicherweise von einigen anderen Faktoren, mit denen ich Sie nicht langweilen möchte). .
Schließlich erfordern viele PHP-Frameworks, einschließlich Symfony , Zend und Laravel (dies wird in den Codierungsrichtlinien nicht erwähnt , folgt jedoch der Klage) und der PSR-2-Standard (Punkt 2.2) das Weglassen des schließenden Tags. PHP-Handbuch selbst ( 1 , 2 ), Wordpress , Drupal und viele andere PHP-Software, denke ich, raten dazu. Wenn Sie es sich einfach zur Gewohnheit machen, dem Standard zu folgen (und PHP-CS-Fixer für Ihren Code einzurichten ), können Sie das Problem vergessen. Andernfalls müssen Sie das Problem immer im Kopf behalten.
Bonus: ein paar Fallstricke (derzeit einer), die sich auf diese 2 Charaktere beziehen:
?>
. Ein Beispiel ist Smarty, selbst die neuesten Versionen von 2. * und 3. * haben dies. Achten Sie also wie immer auf Code von Drittanbietern . Bonus in Bonus: Ein regulärer Ausdruck zum Löschen unnötiger PHP-Endungen: Ersetzen Sie(\s*\?>\s*)$
alle Dateien, die PHP-Code enthalten , durch leeren Text.quelle
\?>(?s:.){0,10}\Z
Kurze Erklärung: changeset.hr/blog/miscellaneous/catch-near-eof-with-regex?>
: zB es passt -und würde Lösch-?> Hello
in<?php echo "test"; ?> Hello
. Wir möchten nur geschlossene Tags löschen.[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)
.?>
, wodurch (wie bei jeder Ausgabe) die Header gesendet werden, sobald sie ausgegeben werden. Es gibt keine "HTML-Header" (außer dem nicht verwandten HTML5-<header>
Tag).Der Grund, warum Sie das PHP-Closing-Tag (
?>
) weglassen sollten, ist, dass der Programmierer nicht versehentlich zusätzliche Zeilenumbrüche sendet.Der Grund, warum Sie das PHP-Closing-Tag nicht weglassen sollten, ist, dass es ein Ungleichgewicht in den PHP-Tags verursacht und jeder Programmierer mit einem halben Verstand daran denken kann, keinen zusätzlichen Leerraum hinzuzufügen.
Also für deine Frage:
Nein, es gibt keinen weiteren guten Grund, die endenden PHP-Tags zu überspringen.
Ich werde mit einigen Argumenten abschließen, um mich nicht mit dem schließenden Tag zu beschäftigen:
Menschen können immer Fehler machen, egal wie klug sie sind. Es ist eine gute Idee, sich an eine Praxis zu halten, die die Anzahl möglicher Fehler verringert (IMHO).
PHP ist kein XML. PHP muss sich nicht an strenge XML-Standards halten, um gut geschrieben und funktionsfähig zu sein. Wenn Sie ein fehlendes schließendes Tag stört, dürfen Sie ein schließendes Tag verwenden. Dies ist auf die eine oder andere Weise keine festgelegte Regel.
quelle
Es handelt sich um eine Empfehlung für einen neuen Codierungsstil , die gut gemeint ist und im Handbuch empfohlen wird .
Eschewing
?>
löst jedoch nur ein Rinnsal der häufig gesendeten Ursachen ( Rohausgabe , Stückliste , Mitteilungen usw.) und ihrer Folgeprobleme.PHP enthält tatsächlich etwas Magie, um einzelne Zeilenumbrüche nach dem
?>
schließenden Token zu verschlingen. Dies hat jedoch historische Probleme und lässt Neulinge immer noch anfällig für schuppige Redakteure und ungewolltes Mischen in anderen Leerzeichen?>
.Stilistisch bevorzugen einige Entwickler das Anzeigen
<?php
und?>
als SGML-Tags / XML-Verarbeitungsanweisungen, was die Konsistenz des Gleichgewichts eines nachgestellten Close-Tokens impliziert. (Was übrigens für abhängigkeitsverbindende Klassen nützlich ist , um ineffizientes automatisches Laden von Datei zu Datei zu ersetzen.)Etwas ungewöhnlich ist, dass die Öffnung
<?php
als PHPs Shebang charakterisiert ist (und per binfmt_misc vollständig durchführbar ist ), wodurch die Redundanz eines entsprechenden Close-Tags validiert wird.Es gibt eine offensichtliche Diskrepanz zwischen den vorgeschriebenen klassischen PHP- Syntaxhandbüchern
?>\n
und den neueren (PSR-2), die sich auf das Auslassen einigen.(Fürs Protokoll: Zend Framework, das übereinander postuliert, impliziert nicht seine inhärente Überlegenheit. Es ist ein Missverständnis, dass Experten von unhandlichen APIs angesprochen wurden.
SCMs und moderne IDEs bieten integrierte Lösungen, die vor allem die Pflege von Tags erleichtern.
Wenn Sie von der Verwendung des
?>
Close-Tags abraten, verzögert sich lediglich die Erläuterung des grundlegenden PHP-Verarbeitungsverhaltens und der Sprachsemantik, um seltene Probleme zu vermeiden. Es ist immer noch praktisch für die kollaborative Softwareentwicklung, da die Teilnehmer unterschiedliche Kenntnisse haben.Tag-Variationen schließen
Das reguläre ?> Close-Tag wird auch als
T_CLOSE_TAG
"Close-Token" bezeichnet.Es enthält ein paar weitere Inkarnationen, weil PHPs magisches Newline-Essen :
?>\n (Unix Linefeed)
?>\r (Wagenrücklauf, klassische MACs)
?>\r\n (CR / LF unter DOS / Win)
PHP unterstützt den Unicode-Combo-Zeilenumbruch NEL(U + 0085) jedoch nicht.
Frühe PHP-Versionen hatten IIRC-Compile-Ins, die die Plattform-Agnostik etwas einschränkten (FI wurde sogar nur
>
als Close-Marker verwendet), was der wahrscheinliche historische Ursprung der Close-Tag-Vermeidung ist.Oft übersehen, aber bis PHP7 sie entfernt , kann das reguläre
<?php
Öffnungs-Token gültig mit dem selten</script>
als ungerade schließende Token gepaart werden .Das " Hard Close Tag " ist nicht einmal eines - hat diesen Begriff nur für eine Analogie erfunden. Konzeptionell und in Bezug auf die Verwendung
__halt_compiler
sollte jedoch als nahes Zeichen erkannt werden.Im Grunde genommen verwirft der Tokenizer danach jeglichen Code oder einfache HTML-Abschnitte. Insbesondere PHAR-Stubs nutzen dies oder seine redundante Kombination mit
?>
wie abgebildet.Ebenso wird eine Leere
return;
in Include-Skripten selten ersetzt, wodurch alle?>
mit nachgestellten Leerzeichen nicht mehr wirksam werden.Dann gibt es alle Arten von Soft / Faux- Close-Tag-Variationen; weniger bekannt und selten verwendet, aber normalerweise per auskommentiertem Token:
Einfacher Abstand
// ? >
, um der Erkennung durch den PHPs-Tokenizer zu entgehen.Oder ausgefallene Unicode-Ersatzprodukte
// ﹖﹥
(U + FE56 SMALL QUESTION MARK, U + FE65 SMALL ANGLE BRACKET), die ein regulärer Ausdruck erfassen kann.Beide bedeuten für PHP nichts , können jedoch praktische Verwendung für PHP-unbewusste oder semi-bewusste externe Toolkits haben. Wieder
cat
kommen zusammengefügte Skripte in den Sinn, mit resultierenden// ? > <?php
Verkettungen, die den früheren Dateibereich inline beibehalten.Es gibt also kontextabhängige, aber praktische Alternativen zu einer zwingenden Auslassung von engen Tags.
Das manuelle Babysitten von
?>
engen Tags ist in beiden Fällen nicht sehr zeitgemäß. Dafür gab es schon immer Automatisierungstools (auch wenn es sich nur um Sed / Awk- oder Regex-Oneliners handelt). Bestimmtes:Dies kann im Allgemeinen verwendet werden, um
--unclose
Tags für Code von Drittanbietern zu php oder vielmehr alle (und alle) tatsächlichen Whitespace- / Stücklistenprobleme zu beheben:phptags --warn --whitespace *.php
Es übernimmt auch die
--long
Tag-Konvertierung usw. aus Gründen der Laufzeit- / Konfigurationskompatibilität.quelle
<?php if($var): ?>Hello World<?php endif; ?>
??? Ich bin wirklich neugierig, da es nicht ausdrücklich erwähnt wird.Es ist kein Tag ...
Aber wenn Sie es haben, riskieren Sie Leerzeichen danach.
Wenn Sie es dann als Include oben in einem Dokument verwenden, können Sie Leerzeichen (dh Inhalte) einfügen, bevor Sie versuchen, HTTP-Header zu senden. Dies ist nicht zulässig.
quelle
<?php $i = 1; ?>
dann file2.php:<?php include 'file1.php'; header('Location: http://www.google.com');?>
phpcs
um sicherzustellen, dass das schließende Tag von jeder meiner Dateien übrig bleibt, und mache mir dann keine Sorgen um die Ausgabepufferung :)Es ist ziemlich nützlich, das Schließen nicht hereinzulassen
?>
.Die Datei bleibt für PHP gültig (kein Syntaxfehler) und wie @David Dorward sagte, kann nach dem
?>
.Zum Beispiel,
wird nicht gültig sein.
Aber
werden.
Ausnahmsweise müssen Sie faul sein, um sicher zu sein .
quelle
?>
. sicher ist hier vielleicht nicht das gute Wort. Wie auch immer, es behebt nichts (es ist kein schlechter Code für mich, um Dinge zu verhindern, undecho
hier wäre ein schlechter Code gewesen), aber / und es ist immer noch gültig. Beweise mir das falsch.?>
am Ende einer PHP-Datei stehen. Aber mussten Sie jemals einen Fehler beheben, der durch nachgestellte Leerzeichen verursacht wurde? Außerdem sind nicht alle Server auf die gleiche Weise konfiguriert, insbesondere wenn Sie auf einen anderen Host wechseln. Das Erkennen von Fehlern ist sehr zeitaufwändig. Wenn Sie setzen möchten,?>
tun Sie es einfach, wenn Sie auch etwas nachgestellten Speicherplatz hinzufügen und Ihr Team debuggen muss, um Git die Schuld zu geben ^^Laut den Dokumenten ist es aus folgendem Grund vorzuziehen, das schließende Tag wegzulassen, wenn es sich am Ende der Datei befindet:
PHP-Handbuch> Sprachreferenz> Grundlegende Syntax> PHP-Tags
quelle
Nun, ich kenne den Grund, aber ich kann es nicht zeigen:
Quelle: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html
quelle
Nun, es gibt zwei Sichtweisen.
.php
Erweiterung nichts anderes als eine XML-Datei, die zufällig für PHP-Code analysiert wird..php
Erweiterungen gültige XML-Dateien sein, müssen es aber nicht sein.Wenn Sie der ersten Route glauben, müssen für alle PHP-Dateien End-Tags geschlossen werden. Wenn Sie sie weglassen, wird eine ungültige XML-Datei erstellt. Andererseits haben Sie ohne eine Eröffnungserklärung
<?xml version="1.0" charset="latin-1" ?>
sowieso keine gültige XML-Datei ... Es ist also kein großes Problem ...Wenn Sie der zweiten Route glauben, öffnet dies die Tür für zwei Arten von
.php
Dateien:Auf dieser Grundlage können Nur-Code-Dateien ohne ein schließendes
?>
Tag beendet werden. Es ist jedoch nicht in Ordnung, die XML-Codedateien ohne Schließen zu beenden,?>
da dies das XML ungültig machen würde.Aber ich weiß was du denkst. Sie denken, worauf es ankommt, Sie werden niemals eine PHP-Datei direkt rendern. Wen interessiert es also, ob es sich um gültiges XML handelt? Nun, es ist wichtig, ob Sie eine Vorlage entwerfen. Wenn es sich um gültiges XML / HTML handelt, zeigt ein normaler Browser den PHP-Code einfach nicht an (er wird wie ein Kommentar behandelt). So können Sie die Vorlage verspotten, ohne den PHP-Code in ...
Ich sage nicht, dass das wichtig ist. Es ist nur eine Ansicht, die ich nicht allzu oft sehe. Welchen besseren Ort gibt es also, um sie zu teilen ...
Persönlich schließe ich keine Tags in Bibliotheksdateien, sondern in Vorlagendateien ... Ich denke, es ist eine persönliche Präferenz (und Codierungsrichtlinie), die mehr als alles andere schwierig ist ...
quelle
Zusätzlich zu allem, was bereits gesagt wurde, werde ich einen weiteren Grund einbringen, der für uns ein großes Problem beim Debuggen war.
Apache 2.4.6 mit PHP 5.4 segmentiert tatsächlich Segmentierungsfehler auf unseren Produktionsmaschinen, wenn hinter dem schließenden
php
Tag leerer Platz ist . Ich habe nur Stunden verschwendet, bis ich den Fehler endlich mit Mühe eingegrenzt habe .Hier ist der Fehler, den Apache auslöst:
quelle
"Gibt es einen anderen guten Grund (außer dem Header-Problem), das endende PHP-Tag zu überspringen?"
Sie möchten nicht versehentlich überflüssige Leerzeichen ausgeben, wenn Sie Binärausgaben, CSV- Daten oder andere Nicht-HTML-Ausgaben generieren .
quelle
Vorteile
Nachteile
Fazit
Ich würde sagen, dass die Argumente für das Weglassen des Tags stärker aussehen (hilft, große Kopfschmerzen mit header () zu vermeiden + es ist PHP / Zend "Empfehlung"). Ich gebe zu, dass dies nicht die "schönste" Lösung ist, die ich je in Bezug auf die Syntaxkonsistenz gesehen habe, aber was könnte besser sein?
quelle
Da meine Frage als Duplikat dieser Frage markiert wurde, denke ich, dass es in Ordnung ist, zu posten, warum es aus bestimmten Gründen erwünscht sein kann, das schließende Tag NICHT wegzulassen
?>
.<?php ... ?>
) PHP-Quelle ist ein gültiges SGML-Dokument, das ohne Probleme mit dem SGML-Parser analysiert und verarbeitet werden kann. Mit zusätzlichen Einschränkungen kann es auch gültiges XML / XHTML sein.Nichts hindert Sie daran, gültigen XML / HTML / SGML-Code zu schreiben. Die PHP-Dokumentation ist sich dessen bewusst. Auszug:
Natürlich ist die PHP-Syntax nicht streng SGML / XML / HTML und Sie erstellen ein Dokument, das nicht SGML / XML / HTML ist, genauso wie Sie HTML in XHTML umwandeln können, um XML-kompatibel zu sein oder nicht.
Irgendwann möchten Sie möglicherweise Quellen verketten. Dies ist nicht so einfach wie das einfache Ausführen von
cat source1.php source2.php
Inkonsistenzen, die durch das Weglassen schließender?>
Tags verursacht werden.Ohne dass
?>
es schwieriger ist zu sagen, ob das Dokument im PHP-Escape-Modus oder im PHP-Ignoriermodus belassen wurde (PI-Tag wurde<?php
möglicherweise geöffnet oder nicht). Das Leben ist einfacher, wenn Sie Ihre Dokumente konsequent im PHP-Ignoriermodus belassen. Es ist wie bei gut formatierten HTML-Dokumenten im Vergleich zu Dokumenten mit nicht geschlossenen, schlecht verschachtelten Tags usw.Es scheint, dass einige Editoren wie Dreamweaver Probleme mit offen gelassenem PI haben könnten [1] .
quelle
Wenn ich die Frage richtig verstehe, hat dies mit der Ausgabepufferung und den möglichen Auswirkungen auf das Schließen / Beenden von Tags zu tun. Ich bin mir nicht sicher, ob dies eine völlig gültige Frage ist. Das Problem ist, dass der Ausgabepuffer nicht bedeutet, dass der gesamte Inhalt im Speicher gespeichert ist, bevor er an den Client gesendet wird. Es bedeutet, dass ein Teil des Inhalts ist.
Der Programmierer kann den Puffer oder den Ausgabepuffer absichtlich leeren. Ändert die Ausgabepufferoption in PHP also wirklich, wie sich das schließende Tag auf die Codierung auswirkt? Ich würde argumentieren, dass dies nicht der Fall ist.
Und vielleicht gingen die meisten Antworten deshalb auf den persönlichen Stil und die Syntax zurück.
quelle
Es gibt 2 mögliche Verwendungen von PHP-Code:
in Fall 1. ist das schließende Tag völlig unbenutzbar, außerdem würde ich in einem solchen Fall gerne nur 1 (ein) offenes PHP-Tag und kein schließendes Tag (Null) sehen. Dies ist eine gute Vorgehensweise, da dadurch der Code sauber und die Logik von der Präsentation getrennt wird. Für den Präsentationsfall (2.) haben einige festgestellt, dass es natürlich ist, alle Tags (auch die von PHP verarbeiteten) zu schließen, was zu Verwirrung führt, da das PHP tatsächlich zwei separate Anwendungsfälle hat, die nicht gemischt werden sollten: Logik / Kalkül und Präsentation
quelle