Abschnitt 1 · Lektion 3
Die PHP-Marken
Jede PHP-Datei fängt mit <?php an. Das ist das Erste, was du tippst, und für jemanden aus dem
HTML-Kurs sieht es aus wie ein Tag, das irgendwo wieder geschlossen werden muss. Genau das stimmt
nicht, und der Irrtum erzeugt später einen Fehler, den man stundenlang sucht.
Ein Schalter, kein Tag
<?php schaltet PHP ein. ?> schaltet es wieder aus. Was dazwischen steht, wird ausgeführt. Was
davor oder danach steht, geht unverändert raus, ohne dass PHP es überhaupt ansieht.
<h1>Preisliste</h1>
<?php
$preis = 30;
echo "<p>Der Preis ist $preis Euro.</p>\n";
?>
<p>Danke für deinen Besuch.</p> Die Überschrift oben und der Dank unten stehen außerhalb. PHP reicht sie durch, so wie es sind. Nur die Zeile in der Mitte entsteht beim Laufen.
Dieses Ergebnis kannst du dir an zwei Stellen ansehen, und der Unterschied ist die ganze Lektion.
Im Reiter Browser steht die Seite, so wie ein Browser sie versteht: eine Überschrift, darunter
zwei Absätze. Und jetzt tipp php index.php im Terminal. Da steht dasselbe noch einmal, aber
Zeichen für Zeichen, so wie dein Programm es geschrieben hat, und <h1>Preisliste</h1> liest sich
dort mit spitzen Klammern.
Derselbe Text, zweimal. Einmal als das, was PHP losschickt, und einmal als das, was ein Browser daraus macht.
Für PHP war das nie eine Überschrift. Es waren Zeichen, die es durchgereicht hat, ohne sie anzusehen. Erst der Browser macht daraus etwas. Diese Arbeitsteilung ist der Grund, warum du HTML und PHP überhaupt mischen kannst.
Damit ist eine PHP-Datei zugleich eine HTML-Datei, und ab Abschnitt 10 ist genau das der Normalfall: Du schreibst deine Seite als HTML und lässt PHP nur die Stellen füllen, die wechseln.
Beachte die Reihenfolge in der Ausgabe. Der HTML-Text kommt genau dort, wo er in der Datei steht, nicht davor und nicht danach. PHP arbeitet die Datei von oben nach unten ab, und Text zwischen den Marken ist für PHP nichts anderes als eine Ausgabe, die schon fertig dasteht.
Die Kurzform, wenn nur ein Wert raus soll
Für den häufigsten Fall gibt es eine kürzere Schreibweise.
<?php
$name = "Mia";
$preis = 30;
?>
<h1>Hallo <?= $name ?></h1>
<p>Dein Preis: <?= $preis ?> Euro</p> <?= $name ?> heißt wörtlich: schalte PHP ein, gib diesen Wert aus, schalte wieder aus. Es ist
dasselbe wie <?php echo $name; ?>, nur ohne das Rauschen. In einer HTML-Zeile ist das viel besser
zu lesen, und das Semikolon darfst du hier weglassen, weil das schließende Tag es ersetzt.
Im Browser steht wieder eine fertige Seite. Und wenn du noch einmal php index.php tippst, siehst
du, dass daran nichts Magisches ist: Aus <?= $name ?> ist schlicht Mia geworden, an genau der
Stelle, an der es stand.
Diese Kurzform ist immer verfügbar. Verwechsle sie nicht mit <? ohne php: Das gab es früher
auch, es hängt aber an einer Einstellung, die auf vielen Servern aus ist. Im Kurs kommt es deshalb
nicht vor, und in eigenem Code hat es auch nichts verloren.
Warum am Dateiende kein schließendes Tag steht
Und jetzt der Teil, der später Ärger macht.
<?php
echo "Ergebnis: 42\n";
?>
Auch dieser Text hier unten. Der Satz unter dem ?> steht in der Ausgabe, obwohl er kein PHP ist. Das ist die Regel von oben,
nur diesmal aus der unangenehmen Richtung: Alles hinter dem schließenden Tag gehört zur Ausgabe.
Jetzt stell dir vor, dort steht kein Satz, sondern ein einzelnes Leerzeichen. Oder ein Zeilenumbruch, weil dein Editor am Dateiende einen anhängt. Passiert genau dasselbe, du siehst es nur nicht.
Auf der Kommandozeile ist das egal. Ab Abschnitt 12 nicht mehr: Dort setzt du Kopfzeilen und leitest
weiter, und beides muss raus, bevor die erste Ausgabe rausgeht. Ein unsichtbares Leerzeichen
hinter einem ?> ist eine Ausgabe. Die Fehlermeldung heißt dann „headers already sent” und nennt
eine Datei, in der scheinbar gar nichts steht.
Deshalb die Regel, an die sich fast alle PHP-Projekte halten: Eine Datei, die nur PHP enthält,
bekommt kein ?> am Ende. Nicht weil es verboten wäre, sondern weil man dann nichts dahinter
vergessen kann. Schau dir die Dateien aus den ersten beiden Lektionen noch einmal an, dort fehlt es
überall.
Wo nach dem PHP-Teil noch etwas kommt, wie im ersten und dritten Beispiel, brauchst du das schließende Tag natürlich. Da hat es einen Zweck.
Ist dir aufgefallen, dass dieses letzte Beispiel seine Ausgabe im Terminal hat und nicht als Seite? Bei den beiden davor läuft ein kleiner Webserver, hier nicht: Es ist ein Skript, es schreibt zwei Zeilen, und damit ist es fertig. Genau so arbeitest du die nächsten acht Abschnitte, und in Abschnitt 10 drehst du den Schalter selbst um.
Ein Detail, das gleich in der Aufgabe vorkommt
Wenn direkt hinter ?> ein Zeilenumbruch steht, schluckt PHP genau diesen einen. Das ist Absicht:
Sonst hätte jeder PHP-Block in einer HTML-Seite eine Leerzeile hinter sich. Der zweite Umbruch
danach würde wieder mit ausgegeben.
Merken musst du dir das nicht. Wundere dich nur nicht, wenn deine Ausgabe eine Zeile weniger hat, als du gezählt hast.
Zum Mitnehmen
Die Marke am Dateianfang sieht aus wie ein Tag, ist aber keins. Sie schaltet PHP ein, und geschlossen werden muss sie nur dort, wo danach wieder Text kommt.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.