mitmario.dev

Zeichenketten

PHP Sandbox 3 Min Lesezeit 3 BeispieleLektion 2 von 7

Text ist das, womit ein PHP-Programm die meiste Zeit hantiert. Eine Begrüßung, eine Fehlermeldung, eine Zeile HTML, eine Adresse. In PHP heißt so ein Stück Text Zeichenkette, und du schreibst es zwischen Anführungszeichen.

Davon gibt es zwei Sorten, und der Unterschied ist keine Frage des Geschmacks.

Die eine Sorte denkt mit, die andere nicht

In der letzten Lektion stand "Hallo $name!" und heraus kam Hallo Mia!. Das lag nicht am echo, sondern an den doppelten Anführungszeichen.

Doppelte Anführungszeichen setzen ein, einfache nicht
<?php

$name = "Mia";

echo "Hallo $name\n";
echo 'Hallo $name\n';
echo "\n";
echo "Fertig\n";

Führ das aus und sieh dir die Ausgabe genau an. Die erste Zeile sagt Hallo Mia. Die zweite sagt Hallo $name\n, mit Dollarzeichen und mit einem sichtbaren Backslash-n am Ende, und danach geht es in derselben Zeile weiter.

In doppelten Anführungszeichen tut PHP zwei Dinge für dich. Es ersetzt Variablennamen durch ihren Wert, und es übersetzt bestimmte Zeichenpaare: \n wird zum Zeilenumbruch, \t zum Tabulator, \\ zu einem einzelnen Backslash. In einfachen Anführungszeichen tut es nichts davon. Dort steht der Text so da, wie du ihn getippt hast, Zeichen für Zeichen.

Deshalb hat die zweite Zeile im Beispiel keinen Umbruch bekommen. Das \n darin ist kein Zeilenumbruch, es sind zwei ganz normale Zeichen. Der Umbruch kommt erst durch das echo "\n"; danach, und das ist auch der übliche Weg, wenn du eine Zeile in einfachen Anführungszeichen brauchst.

Die Faustregel: Nimm einfache Anführungszeichen, außer du brauchst etwas, das nur die doppelten können. Das ist nicht nur eine Frage der Geschwindigkeit, sondern der Vorhersagbarkeit. Zwei Fallen, die ohne diese Regel irgendwann zuschlagen: "C:\neu" enthält einen Zeilenumbruch, weil \n darin steckt, und in "Preis ab $betrag" sucht PHP eine Variable, auch wenn du nur ein Dollarzeichen schreiben wolltest.

Ein Anführungszeichen im Text

Was tust du, wenn der Text selbst Anführungszeichen enthält? Zwei Wege, und du hast beide schon gesehen.

Ein Anführungszeichen mitten im Text
<?php

echo "Sie sagte: \"Guten Tag\"\n";
echo 'Sie sagte: "Guten Tag"';
echo "\n";
echo "Zehn Prozent auf \$50\n";

Der erste Weg ist der Backslash: \" heißt „hier steht ein Anführungszeichen und nicht das Ende der Zeichenkette”. Der zweite ist einfacher und wird oft übersehen: Nimm die andere Sorte. Ein doppeltes Anführungszeichen in einer einfach begrenzten Zeichenkette braucht gar nichts, es ist dort ein gewöhnliches Zeichen.

Dieselbe Überlegung gilt für das Dollarzeichen. In doppelten Anführungszeichen schreibst du \$50, sonst sucht PHP eine Variable namens $50. In einfachen könntest du $50 direkt schreiben.

Umgekehrt gilt: In einfachen Anführungszeichen haben genau zwei Zeichenpaare eine Bedeutung, \' für ein Apostroph und \\ für einen Backslash. Alles andere bleibt, wie es ist.

Wo ein Variablenname aufhört

PHP liest 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 und ein angehängtes es, gesucht wird aber eine Variable $farbees. Dagegen hilft eine geschweifte Klammer, {$farbe}es. Sie sagt PHP, wo der Name endet. Mehr dazu in Lektion 3.2, dort geht es ausführlich ums Zusammensetzen.

Umlaute sind keine Kleinigkeit

Deine Dateien in diesem Kurs sind UTF-8, so wie praktisch jede PHP-Datei heute. Umlaute, ein Eszett, ein Euro-Zeichen kannst du also direkt hineinschreiben und wieder ausgeben.

Nur beim Zählen wird es interessant.

Umlaute zählen doppelt
<?php

$name = "Müller";
$bytes = strlen($name);
$zeichen = mb_strlen($name);

echo "Name: $name\n";
echo "Bytes: $bytes\n";
echo "Zeichen: $zeichen\n";

Müller hat sechs Buchstaben, aber strlen sagt sieben. Der Grund: strlen zählt keine Zeichen, sondern Bytes, und ein ü braucht in UTF-8 zwei davon. Für die Zeichen gibt es eine eigene Funktion, mb_strlen, und die sagt sechs.

Dass das keine Eigenheit von PHP ist, zeigt dir das Terminal: printf 'Müller' | wc -c zählt die Bytes des Wortes ohne jedes PHP und sagt ebenfalls 7. Und printf 'Müller' | od -c schreibt jedes Byte einzeln hin; an der Stelle des ü stehen zwei Zahlen, 303 274.

Merk dir für den ganzen Kurs: Überall, wo ein Mensch das Ergebnis zu sehen bekommt, nimmst du die mb_-Fassung. Eine Namensliste, die nach zwanzig Zeichen abschneidet, würde sonst bei manchen Namen mitten in einem Umlaut aufhören, und dort steht danach ein Fragezeichen. Beide Funktionen kommen in Lektion 3.5 wieder, mit ihrer ganzen Verwandtschaft.

Übrigens taucht diese Byte-Zählung in Lektion 2.4 noch einmal auf, an einer Stelle, an der man sie nicht erwartet.

Zum Mitnehmen

Doppelte Anführungszeichen setzen Werte ein und übersetzen Zeichen wie das n hinter dem Backslash. Einfache nehmen alles wörtlich. Das ist keine Geschmacksfrage, das ist der ganze Unterschied.

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 3 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.