416 Stimmen

Warum sollte man das Close-Tag weglassen?

Ich lese immer wieder, dass es schlechte Praxis ist, den PHP-close-Tag zu verwenden ?> am Ende der Datei. Das Kopfzeilenproblem scheint in folgendem Zusammenhang irrelevant zu sein (und dies ist bisher das einzige gute Argument):

Moderne PHP-Versionen setzen das output_buffering-Flag in php.ini Wenn die Ausgabepufferung aktiviert ist, können Sie HTTP-Header und Cookies nach der HTML-Ausgabe setzen, da der zurückgegebene Code nicht sofort an den Browser gesendet wird.

Jedes gute Praxisbuch und jedes Wiki beginnt mit dieser "Regel", aber niemand liefert gute Gründe dafür. Gibt es einen weiteren guten Grund, den abschließenden PHP-Tag auszulassen?

15voto

Shikiryu Punkte 10080

Es ist ziemlich nützlich, die Schließung nicht zuzulassen ?> in.

Die Datei bleibt für PHP gültig (kein Syntaxfehler) und wie @David Dorward sagte, erlaubt es, Leerzeichen / Zeilenumbrüche (alles, was einen Header an den Browser senden kann) nach der ?> .

Zum Beispiel,

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10);
    imagepng ( $img);
?>
[space here]
[break line here]

nicht gültig sein wird.

Aber

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10 );
    imagepng ( $img );

wird.

Ausnahmsweise muss man faul sein, um zu sein sicher .

9voto

tawfekov Punkte 5034

Nun, ich kenne den Grund, aber ich kann ihn nicht zeigen:

Bei Dateien, die nur PHP-Code enthalten, wird der schließende Tag ( ?> ) erlaubt. Sie ist und sein Weglassen verhindert die versehentliche Einfügung von weißen Zeichen am Ende Leerzeichen in die Antwort.

Quelle: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html

9voto

ircmaxell Punkte 159431

Nun, es gibt zwei Möglichkeiten, dies zu betrachten.

  1. PHP-Code ist nichts anderes als ein Satz von XML-Verarbeitungsanweisungen und daher jede Datei mit einem .php Erweiterung ist nichts anderes als eine XML-Datei, die zufällig für PHP-Code geparst wird.
  2. PHP teilt zufällig das Format der XML-Verarbeitungsanweisungen für seine Open- und Close-Tags. Auf dieser Grundlage können Dateien mit .php Erweiterungen KÖNNEN gültige XML-Dateien sein, sie müssen es aber nicht.

Wenn Sie dem ersten Weg folgen, müssen alle PHP-Dateien mit End-Tags geschlossen werden. Wenn Sie diese weglassen, entsteht eine ungültige XML-Datei. Andererseits, ohne ein öffnendes <?xml version="1.0" charset="latin-1" ?> Erklärung haben Sie ohnehin keine gültige XML-Datei... Es ist also kein großes Problem...

Glaubt man dem zweiten Weg, so eröffnet dies die Möglichkeit, zwei Arten von .php Dateien:

  • Dateien, die nur Code enthalten (z. B. Bibliotheksdateien)
  • Dateien, die sowohl natives XML als auch Code enthalten (z. B. Vorlagendateien)

Demnach können Dateien, die nur aus Code bestehen, ohne ein abschließendes ?> Tag. Aber die XML-Code-Dateien dürfen nicht ohne ein abschließendes ?> da dies die XML-Datei ungültig machen würde.

Aber ich weiß, was Sie jetzt denken. Sie denken, was spielt das für eine Rolle, Sie werden nie eine PHP-Datei direkt rendern, also wen kümmert es, ob es gültiges XML ist. Nun, es ist wichtig, wenn Sie eine Vorlage entwerfen. Wenn es sich um gültiges XML/HTML handelt, wird ein normaler Browser den PHP-Code einfach nicht anzeigen (er wird wie ein Kommentar behandelt). Sie können also die Vorlage nachbilden, ohne den PHP-Code darin ausführen zu müssen...

Ich sage nicht, dass das wichtig ist. Es ist nur eine Ansicht, die ich nicht allzu oft geäußert sehe, und es gibt keinen besseren Ort, um sie zu teilen...

Ich persönlich schließe keine Tags in Bibliotheksdateien, wohl aber in Vorlagendateien... Ich denke, es ist eine persönliche Vorliebe (und Codierung Richtlinie) mehr als alles hart basiert...

7voto

Artem Russakovskii Punkte 20909

Zusätzlich zu allem, was bereits gesagt wurde, möchte ich noch einen weiteren Grund anführen, der uns bei der Fehlersuche große Schwierigkeiten bereitet hat.

Apache 2.4.6 mit PHP 5.4 führt auf unseren Produktionsmaschinen zu Segmentierungsfehlern, wenn sich hinter der Schließung ein leerer Raum befindet. php Tag. Ich habe Stunden vergeudet, bis ich den Fehler schließlich mit strace .

Hier ist der Fehler, den Apache ausgibt:

[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)

5voto

user1238364 Punkte 71

"Gibt es einen anderen guten Grund (außer dem Header-Problem), den abschließenden php-Tag zu überspringen?"

Sie wollen nicht versehentlich fremde Leerzeichen ausgeben, wenn Sie binäre Ausgaben erzeugen, CSV Daten oder andere Nicht-HTML-Ausgaben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X