Forum: PC-Programmierung "?>" am Ende einer PHP-Datei erforderlich?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Xxx X. (blubbb)


Lesenswert?

Siehe Betreff. Ich habe versucht, Google zu befragen. Aber wie manch 
andere vielleicht schon festgestellt haben, bekommt man auf derartige 
Anfragen kein sinnvolles Ergebnis.

Hintergrund: Ich erzeuge mit PHP eine Bilddatei (PNG). Manche 
Texteditoren fügen ungefragt einen Zeilenumbruch bzw. eine Leerzeile an 
das Ende der Datei. Wenn ich "?>" am Ende einfüge, landet die folgende 
Leerzeile in der Bilddatei, was nicht zulässig ist.

von Daniel A. (daniel-a)


Lesenswert?

Das "?>" am Ende ist optional, kannst du weg lassen.

von Kolja L. (kolja82)


Lesenswert?


von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Xxx X. schrieb:
> Ich erzeuge mit PHP eine Bilddatei (PNG). Manche
> Texteditoren fügen ungefragt einen Zeilenumbruch bzw. eine Leerzeile an
> das Ende der Datei.
Was hat die Bilddatei mit dem Texteditor zu tun?
Abgesehen davon: Für den Zeilenumbruch am Dateiende hat jeder halbwegs 
aktuelle Editor ein Setting.

von Foobar (asdfasd)


Lesenswert?

> Nein:
> 
https://www.php.net/manual/en/language.basic-syntax.instruction-separation.php#:~:text=The%20closing%20tag%20of%20a%20PHP%20block%20at%20the%20end,headers%20to%20the%20response%20later.

Note:

 The closing tag of a PHP block at the end of a file is optional, and in 
some cases omitting it is helpful when using include or require, so 
unwanted whitespace will not occur at the end of files, and you will 
still be able to add headers to the response later. It is also handy if 
you use output buffering, and would not like to see added unwanted 
whitespace at the end of the parts generated by the included files.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Er meint das Problem, daß die Webserver/PHP-Kombination eine jede Datei 
erstmal - egal wie sie heißt - als HTML behandelt, dann den Teil 
zwischen den PHP-Tags (<?php und ?>) gegen den Rückgabewert des 
PHP-Scripts austauscht und das entstandene Dokument abschickt. Alles was 
nach dem ?> in der PHP-Datei steht, wird so wie es ist nach der 
PHP-Ausgabe mit übertragen.

Also aus
1
Der Korb enthält <?php echo 1+1; ?> Birnen.
wird
1
Der Korb enthält 2 Birnen.

Normalerweise ist das bei Bilddateien aber kein Problem, bzw. man kann 
seine Dateien ja daraufhin testen und das störende Zeilenende entfernen.

von Xxx X. (blubbb)


Lesenswert?

Danke!

von Purzel H. (hacky)


Lesenswert?


: Bearbeitet durch User
von Jonas B. (jibi)


Lesenswert?

>>Der Korb enthält <?php echo 1+1; ?> Birnen.

So programmiert man seit 10 Jahren kein php mehr. Das Beispiel bleibt 
natürlich richtig :)

von Sheeva P. (sheevaplug)


Lesenswert?

Jonas B. schrieb:
>>>Der Korb enthält <?php echo 1+1; ?> Birnen.
>
> So programmiert man seit 10 Jahren kein php mehr. Das Beispiel bleibt
> natürlich richtig :)

True, wenngleich: so hat man schon vor 20 Jahren kein PHP mehr 
geschrieben. Nichtsdestotrotz zeigt das Beispiel: PHP ist primär eine 
Template-Engine.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Ja, ich weiß, heute muss man mindestens 3000% Overhead erzeugen, 
beispielsweise jede Funktion aus einer eigenen Datei includieren. Alles 
was nicht mindestes 300 Dateien und 50 Unterverzeichnisse benötigt, ist 
kein echtes Programm und darf keinesfalls so genannt werden. 30 
gleichzeitig benutzte Frameworks und Extensions helfen dabei sehr. Die 
Kommentare müssen mindestens den fünffachen Platz beanspruchen wie der 
Code und am besten schreibt man einfach das genaue Gegenteil von dem 
hinein, was direkt aus dem Code ersichtlich wäre. Mit all diesen 
Grundsätzen ist zuverlässig sichergestellt, daß auch ja kein anderer 
mehr das Projekt überblicken kann und die Performance so richtig in den 
Keller geht. Anders lässt sich kein Bedarf nach neuer Server-Hardware 
generieren.

Sorry, aber das sind doch Stilfragen. Das macht sowieso jeder anders 
bzw. so wie er will oder wie es vorgegeben wird, danach kommt noch der 
irre Kleinkrieg bezüglich funktionaler oder objektorientierter 
Programmierung und natürlich würde jeder lieber sterben anstatt 
zuzugeben, daß die jeweils andere Möglichkeit auch ihre Vorteile und 
Daseinsberechtigung hat - was dazu führt, daß am Ende alle den gleichen 
Tod sterben, aber jeder auf seine eigene Weise.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Ben B. schrieb:
> was dazu führt, daß am Ende alle den gleichen
> Tod sterben, aber jeder auf seine eigene Weise.

Das ist aber irgendwie auch wieder beruhigend, oder?

von Daniel D. (danielduese)


Lesenswert?

Schreib einfach ein exit; ans Ende und Problem gelöst.
Normalerweise wird ein Zeilenumbruch nach ?> von Php unterdrückt.

: Bearbeitet durch User
Beitrag #7531842 wurde vom Autor gelöscht.
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

PHP kann keinen Zeilenumbruch nach ?> unterdrücken,
weil der im HTML-Container steht und PHP den gar nicht erst sieht.

von Harald K. (kirnbichler)


Lesenswert?

Ben B. schrieb:
> PHP kann keinen Zeilenumbruch nach ?> unterdrücken,
> weil der im HTML-Container steht und PHP den gar nicht erst sieht.

Wenn es um eine PHP-Datei geht, und nicht um in HTML eingebettetes PHP, 
sollte das anders aussehen.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Wie willst Du das anstellen? Für den Webserver ist grundsätzlich alles 
plain Text erstmal HTML, egal ob es .PHP heißt, .HTML, .XHTML, .PHTML 
oder irgendwie anders. Es ist noch nicht mal XHTML oder so, sondern das 
wird es alles erst durch das, was im Header steht und nur der Browser 
interessiert sich dafür, der Webserver nicht im Geringsten.

Edit: Ein Umweg würde vielleicht funktionieren, wenn man das gewünschte 
Bild mit PHP generiert, es auf die Serverplatte schreibt und dann vom 
Browser direkt vom Webserver laden lässt, dann ist die Bilddatei 
"sauber". Aber das wäre ein ziemlicher Sackstand, man braucht gleich 
dazu noch ein Script was da regelmäßig aufräumt, so daß man die Platte 
nicht zumüllt. Da entferne ich lieber manuell einen störenden 
Zeilenumbruch am Ende einer bilderzeugenden .PHP-Datei oder lasse das ?> 
Tag weg, auch wenn's irgendwie unsauber aussieht.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Ben B. schrieb:
> Es ist noch nicht mal XHTML oder so, sondern das
> wird es alles erst durch das, was im Header steht und nur der Browser
> interessiert sich dafür, der Webserver nicht im Geringsten.

Du übersiehst, daß PHP auf dem Webserver und nicht im Browser ausgeführt 
wird.

Der Browser bekommt PHP überhaupt nicht zu sehen.

von Daniel D. (danielduese)


Lesenswert?

Harald K. schrieb:
> Wenn es um eine PHP-Datei geht, und nicht um in HTML eingebettetes PHP,
> sollte das anders aussehen.

PHP Code macht nur in einer.php Datei Sinn weil die Codeblöcke ansonsten 
nicht vom PHP Modul des Webservers verarbeitet werden.
Das PHP Modul greift alle  Blöcke raus, ersetzt diese durch eigene 
Ausgaben und schickt dann erst das gesamte Dokument als Output.
Dabei greift es die Blicke inkl. optional einem Zeilenumbruch heraus.
<?php...?>\n<?php...?>

Ist das selbe wie
<?php...?><?php...?>

Aber nicht wie
<?php...?> <?php...?>

\n steht hier für einen Zeilenumbruch. Ich weiß nicht, wieso ein echter 
Zeilenumbruch in diesem Forum nicht angezeigt wird.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Daniel D. schrieb:
> Ich weiß nicht, wieso ein echter
> Zeilenumbruch in diesem Forum nicht angezeigt wird

Packe Deinen Text in [ pre ] [ /pre ] Tags (ohne Leerzeichen nach/vor 
den Klammern)

von Max M. (max_mueller)


Lesenswert?

Chat GPT Antwort auf die Frage "?>" am Ende einer PHP-Datei 
erforderlich?
Nein, das Zeichen "?>" am Ende einer PHP-Datei ist nicht erforderlich. 
In der Regel wird empfohlen, das schließende PHP-Zeichen "?>" am Ende 
einer PHP-Datei wegzulassen. Der Grund dafür ist, dass das Vorhandensein 
von Leerzeichen oder Zeilenumbrüchen nach dem schließenden PHP-Zeichen 
dazu führen kann, dass unerwünschter Text an die Ausgabe gesendet wird, 
was zu unerwartetem Verhalten führen kann. Da PHP-Dateien, die nur 
PHP-Code enthalten, am Ende keinen schließenden Tag benötigen, wird 
empfohlen, das schließende PHP-Zeichen wegzulassen, um solche Probleme 
zu vermeiden.

von Harald K. (kirnbichler)


Lesenswert?

Max M. schrieb:
> Chat GPT Antwort (...) erforderlich?

Noch überflüssiger ist nur die FDP.

von Max M. (max_mueller)


Lesenswert?

tja, aber dummerweise ist die Antwort richtig und klar mit nein 
beantwortet worden und somit ist dein Kommentar überflüssig;-)

von Daniel D. (danielduese)


Lesenswert?

ChatGPT sollte man nie glauben.
Was, wenn ich so eine Datei mittels require in eine andere einbinde? 
Dann gibt's n Problem.

ChaGPT ist nicht dazu da, das man klüger wird, sondern dass man lernt, 
dass man schon klüger ist.

: Bearbeitet durch User
von Max M. (max_mueller)


Lesenswert?

Google und Foren sollte man auch nicht einfach glauben.
Man sollte immer verifizieren...

Ob es beim Einbinden in Dateien ein Problem gibt, kannst du ja ChatGPT 
ebenfalls fragen und dieses dann ebenfalls natürlich überprüfen.
Oftmals Antwortet CGPT aber bereits auf die erste Frage richtig und das 
verifizieren geht dann schnell.
Bei Google sucht man dann ewig und muss es dann dennoch auch 
verifizieren.

Klug ist der kluges tut;-)

: Bearbeitet durch User
von Daniel D. (danielduese)


Lesenswert?

Und den Beiträgen hier sollte man... Naja du weißt schon.
Und dennoch: ChatGPT ist mit Uraltdaten gefüttert. Ich glaube nicht daß 
"empfohlen wird auf das schließen des Php Blocks am Dateiende zu 
verzichten" noch aktuell ist. Quelle dafür?

von Max M. (max_mueller)


Lesenswert?

Die Begründung dafür wurde ja genannt. Quellen findest du bestimmt bei 
google und nein, die Daten sind nicht "uralt"....
Sowas ändert sich aber auch nicht jedes Jahr...

von Daniel A. (daniel-a)


Lesenswert?

Daniel D. schrieb:
> ChatGPT sollte man nie glauben.
> Was, wenn ich so eine Datei mittels require in eine andere einbinde?
> Dann gibt's n Problem.

Nein, das geht einwandfrei.

von Weingut P. (weinbauer)


Lesenswert?

Also,
Include
Include_once
Require
Require_once

geht bei php-Dateien ohne Endtag auf m Apachen in PHP 8 bei mir 
einwandfrei

von Kilo S. (kilo_s)


Lesenswert?

Daniel D. schrieb:
> Ich glaube nicht daß "empfohlen wird auf das schließen des Php Blocks am
> Dateiende zu verzichten" noch aktuell ist. Quelle dafür?

https://www.php.net/manual/en/language.basic-syntax.instruction-separation.php

von Daniel D. (danielduese)


Lesenswert?

Ok, überzeugt.

(auch wenn das seit über 20 Jahren noch nie ungewollten Whitespace bei 
mir erzeugt hat. Ich bin halt grundsätzlich für "vollständigen" Code)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.