PHP Handbuch
Zurück | Kapitel 11. Typen | Weiter

# Strings / Zeichenketten

Ein String ist eine Folge von Zeichen. In PHP entspricht ein Zeichen einem Byte, das heißt, dass exakt 256 unterschiedliche Zeichen möglich sind. Das impliziert auch, dass PHP keine native Unterstützung für Unicode bietet. Siehe utf8_encode() und utf8_decode() für etwas Unicode-Unterstützung.

> Anmerkung: Für einen String stellt die Länge kein Problem dar. Von PHP-Seite aus gibt es keine praktische Grenze für die Größe eines Strings. Daher gibt es keinen Grund sich Sorgen über lange Strings zu machen.

## Syntax

Ein String kann auf drei verschiedene Weisen geschrieben werden.

- Einfache Anführungszeichen (single quoted)

- Doppelte Anführungszeichen (double quoted)

- Heredoc Syntax

### Einfache Anführungszeichen (Single quoted)

Der leichteste Weg einen einfachen String zu schreiben, ist der Einschluss in einfache Anführungszeichen (das Zeichen ').

Um ein einfaches Anführungszeichen wörtlich auszugeben, muss dieses, wie in vielen anderen Programmiersprachen auch mit einem Backslash (\) escaped werden. Wenn Sie innerhalb eines Strings einen Backslash vor einem einfachen Anführungszeichen oder am Ende eines Strings ausgeben wollen, müssen Sie diesen verdoppeln. Beachten Sie: wenn Sie versuchen irgendwelche anderen Zeichen zu escapen, wird der Backslash ebenfalls ausgegeben! Daher besteht für gewöhnlich keine Notwendigkeit den Backslash selbst zu escapen.

> Anmerkung: In PHP 3 wird eine Warnung der Stufe E_NOTICE ausgegeben, wenn das passiert.

> Anmerkung: Anders als bei den zwei anderen Schreibweisen werden Variablen und escape-Sequenzen für spezielle Zeichen innerhalb von single-quoted Strings nicht ausgewertet.

`<?php
echo 'Das ist ein einfacher String';
echo 'Sie können auf diese Weise auch Zeilenumbrüche
innerhalb von Strings verwenden, wenn
Ihnen danach ist';
// Ausgabe: Arnold sagte einmal: "I'll be back"
echo 'Arnold sagte einmal: "I\'ll be back"';
// Ausgabe: Sie haben C:\*.* gelöscht?
echo 'Sie haben C:\\*.* gelöscht?';
// Ausgabe: Sie haben C:\*.* gelöscht?
echo 'Sie haben C:\*.* gelöscht?';
// Ausgabe: Das wird nicht ausgewertet: \n ein Zeilenumbruch
echo 'Das wird nicht ausgewertet: \n ein Zeilenumbruch';
// Ausgabe: Variablen werden auch $nicht $ausgewertet
echo 'Variablen werden auch $nicht $ausgewertet';
?>`

### Doppelte Anführungszeichen (Double quoted)

Wenn ein String in doppelten Anführungszeichen (") eingeschlossen ist, versteht PHP mehr Escape-Folgen für spezielle Zeichen:

Tabelle 11-1. Nicht ausgewertete / übergangene Zeichen:

Zeichenfolge | Bedeutung
--- | ---
\n | Zeilenvorschub (LF oder 0x0A als ASCII-Code)
\r | Wagenrücklauf (CR oder 0x0D als ASCII-Code)
\t | horizontaler Tabulator (HT oder 0x09 als ASCII-Code)
\\ | Backslash / Rückstrich
\$ | Dollar-Symbol
\" | doppelte Anführungszeichen
\[0-7]{1,3} | die Zeichenfolge, die dem regulären Ausdruck entspricht ist ein Zeichen in Oktal-Schreibweise
\x[0-9A-Fa-f]{1,2} | die Zeichenfolge, die dem regulären Ausdruck entspricht ist ein Zeichen in Hexadezimal-Schreibweise

Noch einmal: wenn Sie versuchen, irgend ein anderes Zeichen zu escapen wird der Backslash ebenfalls ausgegeben!

Das wichtigste Merkmal von double-quoted Strings ist die Tatsache, dass Variablennamen ausgewertet werden. Für Details siehe String Analyse (parsing)

### Heredoc

Eine andere Möglichkeit Strings einzufassen, besteht im Gebrauch der heredoc-Syntax ("<<<"). Hierfür ist nach <<< ein Bezeichner zu setzen. Nun folgt der eigentliche String und dann derselbe Bezeichner um den String abzuschließen.

Der schließende Bezeichner muss in der ersten Spalte der Zeile stehen. Die verwendeten Bezeichner müssen den gleichen Regeln entsprechen wie alle anderen PHP-Labels auch: Sie dürfen lediglich alphanumerische Zeichen und den Unterstrich enthalten und müssen mit einem Unterstrich oder einem Buchstaben beginnen.

Warnung

Es ist sehr wichtig zu beachten, dass die Zeile mit dem schließenden Bezeichner keine anderen Zeichen enthält, ausgenommen möglicherweise ein Semikolon (;). Das bedeuted im Besonderen, dass der Bezeichner nicht eingerückt werden darf und es dürfen keine Leerzeichen oder Tabulatoren vor oder nach dem Semikolon stehen. Außerdem ist es wichtig, zu beachten, dass das erste Zeichen vor dem schließenden Bezeichner ein der Definition Ihres Betriebssystems entsprechender Zeilenvorschub, sein muss. Das ist zum Beispiel auf einem Macintosh ein \r.

Falls diese Regel gebrochen wird und der schließende Bezeichner nicht "sauber" ist, wird er nicht als schließender Bezeichner betrachtet und PHP wird weiter danach suchen. Wird in diesem Fall kein korrekter schließender Bezeichner gefunden, gibt es einen Parser-Fehler mit der Zeilennummer vom Ende des Skripts.

Heredoc-Text funktioniert wie ein String innnerhalb doppelter Anführungszeichen, nur ohne doppelte Anführungszeichen. Anführungszeichen innerhalb von heredoc-Texten müssen also keiner Sonderbehandlung (escapen) unterzogen werden, aber Sie können dennoch die oben aufgeführten Escape-Anweisungen verwenden. Variablen werden ausgewertet, aber besondere Aufmerksamkeit muss komplexen Variablen gewidmet werden, genau wie bei Strings.

Beispiel 11-2. Beispiel zur String-Festlegung per "heredoc"-Methode:

`<?php
$str = <<<EOD
Beispiel eines Strings
über mehrere Script-Zeilen
durch Gebrauch der heredoc-Syntax.
EOD;
/* komplexeres Beispiel, mit Variablen */
class foo {
var $foo;
var $bar;
function foo() {
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Mein Name';
echo <<<EOT
Mein Name ist "$name". Ich schreibe einige $foo->foo.
Nun schreibe ich gerade einige {$foo->bar[1]}.
Dies sollte ein großes 'A' schreiben: \x41
EOT;
?>`

> Anmerkung: Die heredoc Unterstützung wurde in PHP 4 eingeführt.

### Variablen-Analyse (parsing)

Wird ein String in doppelten Anführungszeichen oder mit heredoc angegeben, werden enthaltene Variablen ausgewertet (geparst).

Es gibt zwei Syntax-Typen: eine einfache und eine komplexe. Die einfache Syntax ist die geläufigste und bequemste. Sie bietet die Möglichkeit eine Variable, einen Array-Wert oder eine Objekt-Eigenschaft auszuwerten (parsen).

Die komplexe Syntax wurde in PHP 4 eingeführt und ist an den geschweiften Klammern {}erkennbar, die den Ausdruck umschließen.

#### Einfache Syntax

Sobald ein Dollarzeichen ($) auftaucht, wird der Parser versuchen, gierig so viele Zeichen wie möglich zu bekommen, um einen gültigen Variablennamen zu bilden. Schließen Sie Ihren Varaiblennamen in geschweifte Klammern ein, wenn Sie ausdrücklich das Ende des Namens angeben wollen.

`<?php $beer = 'Heineken'; echo "$beer's Geschmack ist großartig"; // funktioniert, "'" ist kein gültiges // Zeichen für einen Variablennamen echo "Er hat einige $beers getrunken"; // funktioniert nicht, 's' ist ein gültiges // Zeichen für einen Variablennamen echo "Er hat einige ${beer}s getrunken"; // funktioniert echo "Er hat einige {$beer}s getrunken"; // funktioniert ?>`

Auf ähnliche Weise können Sie erreichen, dass ein Array-Index oder eine Objekt-Eigenschaft ausgewertet wird. Bei Array-Indizes markiert die schließende eckige Klammer (]) das Ende des Index. Für Objekt-Eigenschaften gelten die gleichen Regeln wie bei einfachen Variablen, obwohl es bei Objekt-Eigenschaften keinen Trick gibt, wie dies bei Variablen der Fall ist.

`<?php
// Diese Beispiele sind spezifisch für die Verwendung von Arrays
// innerhalb von Strings. Setzen sie die String-Schlüssel Ihrer Arrays
// außerhalb von Strings immer in Anführungszeichen und verwenden Sie
// außerhalb von Strings auch keine {geschweiften Klammern}.
// Wir lassen uns alle Fehlermeldungen anzeigen
error_reporting(E_ALL);
$früchte = array('Erdbeere' => 'rot' , 'Banane' => 'gelb');
// Funktioniert aber beachten Sie: außerhalb von
// String-Anführungszeichen funktioniert das anders
echo "Eine Banane ist $früchte[Banane].";
// Funktioniert
echo "Eine Banane ist {$früchte['Banane']}.";
// Funktioniert, aber PHP sucht, wie unten beschrieben, zuerst nach
// einer Konstanten namens Banane.
echo "Eine Banane ist {$früchte[Banane]}.";
// Funktioniert nicht; verwenden Sie geschweifte Klammern. Das
// erzeugt einen Parser-Fehler.
echo "Eine Banane ist $früchte['Banane'].";
// Funktioniert
echo "Eine Banane ist " . $früchte['Banane'] . ".";
// Funktioniert
echo "Dieses Quadrat ist $quadrat->breite Meter breit.";
// Funktioniert nicht. Für eine Lösung siehe die komplexe Syntax.
echo "Dieses Quadrat ist $quadrat->breite00 Zentimeter breit.";
?>`

Für irgendetwas Komplexeres sollten Sie die komplexe Syntax nutzen.

#### Komplexe (geschweifte) Syntax

Diese wird nicht komplex genannt, weil etwa die Syntax komplex ist, sondern weil Sie auf diesem Weg komplexe Ausdrücke einbeziehen können.

Tatsächlich können Sie jeden beliebigen Wert einbeziehen, der im Namensbereich in Strings gültig ist. Schreiben Sie den Ausdruck einfach auf die gleiche Art und Weise, wie außerhalb des Strings, und umschließen diesen mit { und }. Da Sie '{' nicht escapen können, wird diese Syntax nur erkannt, wenn auf { unmittelbar $ folgt. (Benutzen Sie "{\$" oder "\{$" um ein wörtliches "{$" zu erhalten.) Einige Beispiele, um dies zu verdeutlichen:

`<?php
// Wir lassen uns alle Fehlermeldungen anzeigen
error_reporting(E_ALL);
$great = 'fantastisch';
// Funktioniert nicht, Ausgabe: Das ist { fantastisch}
echo "Das ist { $great}";
// Funktioniert, Ausgabe: Das ist fantastisch
echo "Das ist {$great}";
echo "Das ist ${great}";
// Funktioniert
echo "Dieses Quadrat ist {$square->width}00 Zentimeter breit.";
// Funktioniert
echo "Das funktioniert: {$arr[4][3]}";
// Das ist aus dem gleichen Grund falsch
// wie $foo[bar] außerhalb eines Strings falsch ist. Mit
// anderen Worten, es funktioniert zwar, aber weil PHP
// zunächst nach einer Konstanten namens foo sucht, gibt
// es einen Fehler der Stufe E_NOTICE (undefined constant)
// aus.
echo "Das ist falsch: {$arr[foo][3]}";
// Funktioniert. Benutzen Sie bei der Verwendung
// mehrdimensionaler Arrays innerhalb von Strings immer
// Klammern um die Arrays.
echo "Das funktioniert: {$arr['foo'][3]}";
// Funktioniert
echo "Das funktioniert: " . $arr['foo'][3];
echo "Sie können sogar schreiben {$obj->values[3]->name}";
echo "Das ist der Wert der Variable mit Namen $name: {${$name}}";
?>`

### Zugriff und Modifikation von Zeichen in Strings

Innerhalb von Zeichenketten (strings) kann durch die Angabe des nullbasierten Offsets in geschweiften Klammern nach dem String auf das gewünschte Zeichen zugegriffen oder dieses modifiziert werden.

> Anmerkung: Für Abwärtskompatibilität können Sie für den selben Zweck immer noch die Array-Klammern verwenden. Diese Syntax wird jedoch seit PHP 4 missbilligt.

Beispiel 11-3. Einige String-Beispiele

`<?php
// Das erste Zeichen eines Strings.
$str = 'Das ist ein Test.'
$erstes = $str{0}; // $erstes enthält "D"
// Das dritte Zeichen eines Strings.
$drittes = $str{2};
// Das letzte Zeichen eines Strings.
$str = 'Das ist immer noch ein Test.'
$letztes = $str{strlen($str)-1}; // $letztes enthält "."
// Das letzte Zeichen eines Strings verändern
$str = 'Schau auf die Straßi';
$str{strlen($str)-1} = 'e';
?>`

## Nützliche Funktionen und Operatoren

Strings können mittels des '.'(dot)-Operators miteinander verbunden werden. Beachten Sie, dass dafür nicht der '+' (Additions)-Operator verwendet werden kann. Für mehr Informationen schauen Sie bitte unter den Zeichenketten-Operatoren nach.

Es gibt eine Menge nützlicher Funktionen zur String-Manipulation.

Für allgemeine Funktionen schauen Sie sich den Abschnitt über String Funktionen an, und für fortgeschrittenes Suchen & Ersetzen die Funktionen zu Regulären Ausdrücken (in zwei Ausführungen: Perl Kompatibel und POSIX erweitert).

Weiterhin gibt es auch noch Funktionen für URL-Strings, und Funktionen zum Verschlüsseln/Entschlüsseln von Strings (mcrypt und mhash).

Schließlich, falls Sie immer noch nicht das gefunden haben wonach Sie suchen, schauen Sie unter den Zeichen-Typen Funktionen nach.

## Umwandlung nach string

Sie können einen Wert mit der (string)-Umwandlung oder mit der Funktion strval() in einen String umwandeln. Die Umwandlung in einen String wird im dem Bereich eines Ausdrucks, in dem ein String benötigt wird, automatisch für Sie vorgenommen. Dies geschieht, wenn Sie die Funktionen echo() oder print() benutzen oder wenn Sie den Wert einer Variablen mit einem String vergleichen. Die Abschnitte über Typen und Typen-Tricks verdeutlichen das folgende. Siehe auch settype().

Ein Boolean `TRUE`-Wert wird in den String "1" umgewandelt, der `FALSE`-Wert wird als "" (leerer String) dargestellt. Dadurch können Sie Boolean- und String-Werte ineinander umwandeln.

Ein Integer oder eine Fließkommazahl (Float) wird in einen String umgewandelt, der die Zahl durch seine Ziffern darstellt (bei Fließkommazahlen inklusive Exponententeil).

Arrays werden immer in den String "Array" umgewandelt. Sie können also den Inhalt eines Arrays nicht mit echo() oder print() ausgeben, um zu sehen, was es enthält. Um ein Element anzuschauen, benötigen Sie etwas in der Art echo $arr['foo']. Siehe weiter unten für Hinweise zur Ausgabe/Ansicht des kompletten Inhalts.

Objekte werden immer in den String "Object" umgewandelt. Wenn Sie für die Fehlersuche die Werte der Mitgliedsvariablen eines Objekts ausgeben möchten, lesen Sie bitte die Abschnitte weiter unten. Benutzen Sie get_class(), wenn Sie den Namen der Klasse erfahren möchten, von der ein Objekt eine Instanz ist.

Ressourcen werden immer in Strings mit der Struktur "Resource id #1" umgewandelt, wobei 1 die eindeutige Nummer ist, die der Resource von PHP zur Laufzeit zugeordnet wurde. Benutzen Sie get_resource_type(), wenn Sie wissen möchten, welchen Typs die Ressource ist.

`NULL` wird immer in einen leeren String umgewandelt.

Wie Sie oben erfahren haben, liefert Ihnen die Ausgabe von Arrays, Objekten oder Ressourcen keine brauchbaren Informationen über die Werte selbst. Schauen Sie sich für eine bessere Möglichkeit, sich Werte für die Fehlersuche ausgeben zu lassen, die Funktionen print_r() und var_dump() an.

Sie können PHP-Werte auch in Strings umwandeln, um sie dauerhaft zu speichern. Diese Methode wird als Serialisierung bezeichnet und kann mit der Funktion serialize() vorgenommen werden. Falls Ihr PHP über WDDX-Unterstützung verfügt, können Sie PHP-Werte auch in XML-Strukturen serialisieren.

## Umwandlung von Strings in Zahlen

Sobald ein String als numerischer Wert ausgewertet wird, werden der resultierende Wert und der Typ wie folgt festgelegt.

Der String wird als float ausgewertet, wenn er eines der Zeichen '.', 'e' oder 'E' enthält. Ansonsten wird er als Integer-Wert interpretiert.

Der Wert wird durch den Anfangsteil des Strings bestimmt. Sofern der String mit gültigen numerischen Daten beginnt, werden diese als Wert benutzt. Andernfalls wird der Wert 0 (Null) sein. Gültige numerische Daten sind ein optionales Vorzeichen, gefolgt von einer oder mehreren Zahlen (optional mit einem Dezimalpunkt). Wahlweise kann auch ein Exponent angegeben werden. Der Exponent besteht aus einem 'e' oder 'E', gefolgt von einer oder mehreren Zahlen.

`<?php
$foo = 1 + "10.5"; // $foo ist float (11.5)
$foo = 1 + "-1.3e3"; // $foo ist float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo ist integer (1)
$foo = 1 + "bob3"; // $foo ist integer (1)
$foo = 1 + "10 Kleine Schweine"; // $foo ist integer (11)
$foo = 4 + "10.2 Ferkel"; // $foo ist float (14.2)
$foo = "10 Schweine " + 1; // $foo ist integer (11)
$foo = "10.0 Schweine " + 1; // $foo ist float (11)
$foo = "10.0 Schweine " + 1.0; // $foo ist float (11)
?>`

Weitere Informationen über solche Umwandlungen finden Sie in den UNIX Manualseiten unter strtod(3).

Wenn Sie irgendein Beispiel dieses Abschnitts testen wollen, können Sie dieses per "Copy und Paste" übernehmen. Fügen Sie die folgende Zeile Ihrem Skript hinzu und Sie sehen selbst was passiert:

`<?php echo "\$foo==$foo; Typ ist " . gettype ($foo) . "<br />\n"; ?>`

Erwarten Sie nicht, den Code eines Zeichens zu bekommen, indem Sie es in einen Integer umwandeln (wie das z.B. in C der Fall wäre). Benutzen Sie die Funktionen ord() und chr(), um Zeichencodes und Zeichen ineinander umzuwandeln.

Zurück | Zum Anfang | Weiter
Fließkomma-Zahlenwerte | Nach oben | Arrays