mitmario.dev

Text zusammensetzen

PHP Sandbox 3 Min Lesezeit 4 BeispieleLektion 2 von 7

Bisher hast du entweder fertige Texte ausgegeben oder Werte in doppelte Anführungszeichen gesetzt. Jetzt kommt der dritte Weg dazu, und mit ihm die häufigste Stolperstelle für alle, die schon eine andere Sprache kennen.

Der Punkt verbindet, das Plus rechnet

Der Punkt verbindet, das Plus rechnet
<?php

$vorname = "Mia";
$nachname = "Berg";

echo $vorname . " " . $nachname . "\n";
echo "Zahl als Text: " . 3 . "\n";
echo "5" + 5, "\n";
echo "Jetzt kommt der Fehler\n";
echo "Hallo " + $vorname;

In PHP werden zwei Texte mit einem Punkt verbunden. Nicht mit einem Plus, auch wenn das in JavaScript, Python und Java so aussieht. Das Plus ist in PHP ausschließlich zum Rechnen da.

Was passiert, wenn man es trotzdem nimmt, hängt davon ab, was links und rechts steht, und beide Fälle sind unangenehm. Steht dort eine Zahl in Anführungszeichen, rechnet PHP damit: "5" + 5 ergibt 10 und nicht 55. Steht dort echter Text, bricht das Programm ab, mit Uncaught TypeError: Unsupported operand types und Exit-Code 255. Genau das siehst du am Ende des Beispiels, und die drei Zeilen davor sind der Beweis, dass bis dahin alles lief.

Der stille erste Fall ist der gefährlichere. Er sieht nach nichts aus und liefert eine Zahl, mit der du weiterarbeitest.

Nebenbei zeigt das Beispiel noch etwas: Der Punkt macht aus einer Zahl klaglos Text. "Zahl als Text: " . 3 ergibt einen Satz, ohne dass du irgendetwas umwandeln musst.

Werte direkt im Text

Werte direkt im Text
<?php

$name = "Mia";
$anzahl = 3;

echo "$name hat $anzahl Buecher.\n";
echo $name . " hat " . $anzahl . " Buecher.\n";

Die zweite Möglichkeit kennst du schon aus Lektion 2.2: In doppelten Anführungszeichen setzt PHP Variablen direkt ein. Beide Zeilen im Beispiel geben dasselbe aus.

In diesem Kurs steht meistens die erste Form, weil sie sich näher am fertigen Satz liest. Man sieht die Leerzeichen an ihrem Platz und muss sie nicht aus vier Anführungszeichen und drei Punkten zusammenrechnen. Ein fehlendes Leerzeichen ist übrigens der zweithäufigste Fehler beim Verbinden, gleich nach dem Plus.

Es gibt aber Fälle, in denen der Punkt gewinnt. Sobald in der Mitte etwas ausgerechnet wird, geht das nicht mehr in die Zeichenkette hinein. Ein number_format($preis, 2) oder ein $a * $b gehört neben den Text und nicht hinein, und dann verbindest du mit Punkten. In der Aufgabe zu dieser Lektion brauchst du genau diese Mischung.

Wo PHP den Namen nicht mehr erkennt

Wo PHP den Namen nicht mehr erkennt
<?php

$farbe = "rot";
$daten = ["preis" => 47.5, "ware" => "Buch"];

echo "Ohne Klammern geht schief: $farbees\n";
echo "Mit Klammern klappt es:    {$farbe}es\n";
echo "Ein Schluessel ohne Anfuehrungszeichen: $daten[ware]\n";
echo "Ein Schluessel mit Anfuehrungszeichen:  {$daten["ware"]}\n";

Beim Einsetzen liest PHP den Namen nach dem Dollarzeichen so weit, wie er noch ein gültiger Name sein kann. Meistens passt das. Bei "$farbees" passt es nicht: Gemeint war $farbe mit angehängtem es, gesucht wird $farbees. Das Ergebnis ist eine Warnung und eine Lücke im Satz.

Dagegen helfen geschweifte Klammern. {$farbe}es sagt PHP, wo der Name aufhört, und heraus kommt rotes.

Der zweite Fall betrifft eine Liste. Ein Wert daraus kommt so in den Text: $daten[ware], und das funktioniert tatsächlich. Sobald der Schlüssel aber in Anführungszeichen steht, und außerhalb einer Zeichenkette gehört er dorthin, braucht es die Klammern: {$daten["ware"]}. Ohne sie ist die Zeile ein Parse-Fehler, das Skript startet gar nicht erst.

Die Faustregel, mit der du beide Fälle erschlägst: Wenn nach dem Dollarzeichen mehr steht als ein schlichter Name, setz geschweifte Klammern um das Ganze. Sie schaden nie. Um Listen geht es ausführlich in Abschnitt 5, hier reicht das Muster.

Stück für Stück anhängen

Stück für Stück anhängen
<?php

$zeile = "";
$zeile .= "Kaffee";
$zeile .= " - ";
$zeile .= "2 Stueck";

echo $zeile, "\n";

Manchmal entsteht ein Text nicht in einem Rutsch, sondern wächst. Dafür gibt es .=, die Kurzform für „nimm, was schon drinsteht, und häng das hier an”. Es ist derselbe Gedanke wie += beim Rechnen aus der letzten Lektion, nur eben mit dem Punkt. Das Wachsen siehst du im Reiter Debug: Nach Aufzeichnen steht an jeder Zeile, was gerade in zeile liegt, erst "", dann "Kaffee", dann "Kaffee - ", und vor dem echo der ganze Satz.

Wichtig ist die erste Zeile: $zeile = ""; legt einen leeren Text an, bevor angehängt wird. Ohne sie existiert die Variable beim ersten .= noch nicht, und PHP meldet eine Warnung. Richtig wird das Ergebnis trotzdem, weshalb dieser Fehler gern lange unbemerkt bleibt.

Sein volles Gewicht bekommt .= erst mit den Schleifen aus Abschnitt 4, wenn eine Liste Zeile für Zeile zu einem Text zusammenwächst.

Zum Mitnehmen

In PHP verbindet der Punkt zwei Texte, nicht das Plus. Wer aus einer anderen Sprache kommt, tippt hier zuverlässig ein Plus und bekommt entweder eine falsche Zahl oder einen Absturz.

Jetzt du

Basis Konto, kostenlos

Zu 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 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.