Single Quotes oder Double Quotes?

Single Quotes oder Double Quotes, das ist hier die Frage!

Gerade als Lernender kann es manchmal recht verwirrend sein sich für die richtigen Anführungszeichen zu entscheiden. Gelegentlich kommt es dadurch auch schon mal zu Fehler im Script, die einen bei der Fehlersuche schnurgerade in die Verzweiflung treiben können.

Welche Anführungszeichen die richtigen sind hängt von der gegebenen Situation und Aufgabe ab. Aspekte wie die Lesbarkeit des Code, Performance, spezielle Funktionen (Steuerungszeichen oder Variablen innerhalb von Zeichenketten) und Fehlerverhütung haben einen Einfluss auf die Entscheidung.
Um hier etwas Licht in’s Dunkel zu bringen, werden wir uns verschiedene Beispiele anschauen, anhand deren ich einige allgemeine Tipps gebe.

Welche Arten von Anführungszeichen gibt es?

In PHP benutzen wir 2 Arten von Anführungszeichen:

  1. Single Quotes – Einfache Anführungszeichen, besser bekannt als Apostroph, die man mit Shift + # erzeugt: ‚
  2. Double Quotes – Doppelte Anführungszeichen, auch bekannt als Gänsefüsschen. Erzeugt mit Shift + 2: „

Benutzen wir allerdings auch MySQL Statements in PHP, so gibt es noch eine Dritte Art von Anführungszeichen, der Backtick (`). Dieser Backtick ist uns besser bekannt als Akzent. Erzeugt wird er durch halten der Shift Taste und zusätzliches drücken der Taste neben Backspace. Benutzt man nur einen Backtick muß man, um ihn sichtbar zu machen, eine weitere Taste (z.B. Leertaste) drücken. Doppelte Backticks erzeugt man durch Shift + zweimaliges drücken der Akzent-Taste. Was genau es mit dem Backtick auf sich hat erkläre ich später.

Hinweis:
Im weiteren Verlauf dieses Artikels werde ich folgende Abkürzungen verwenden:
SQ = Single Quote / Apostroph
DQ = Double Quotes / Gänsefüsschen

Quotes in der Praxis

Der Unterschied
Der Große Unterschied zwischen SQ und DQ ist, dass PHP Text zwischen DQ parst und gefundene Variablen, Steuerungszeichen, u.ä. interpretiert. Bei SQ erfolgt die Ausgabe direkt, ohne dass PHP sich erst noch die Mühe macht den Text zwischen den SQ zu analysieren.

Performance
Angesichts der letzten Aussage sollte es logisch erscheinen, dass SQ der performantere Weg ist. Auch wenn bei sehr ausführlichen Benchmarks der Unterschied messbar ist, so spielt es in der Praxis eher selten eine gravierende Rolle welche Quotes man benutzt, da sich die Unterschiede im Millisekunden-Bereich bewegen. Dies trifft auf kleinere Webseiten zu. Bei grossen Projekten mit sehr vielen Besuchern und intensivem Einsatz von Quotes, kann es sich aber dennoch bemerkbar machen.
Falls Ihr selbst einige Tests durchführen möchtet, könnt Ihr dieses Benchmark Script als Grundlage benutzen:

<?php
// Ausgabepuffer aktivieren
ob_start();
 
 // Zeitnahme berechnen  
function differenz( $start, $ende )
{
    list( $start_msek, $start_sek ) = explode( " ", $start );
    list( $ende_msek, $ende_sek )   = explode( " ", $ende );
    return $ende_sek - $start_sek + $ende_msek - $start_msek;
}
// Startzeit
$startzeit = microtime();
 
 
// Code dessen Laufzeit gemessen wird
for ($i = 1; $i <= 50000; $i++)
{
    /* *** Hier steht der Code zum benchmarken *** */
}
 
// Pufferung verwerfen und deaktivieren
ob_end_clean();
 
// Endzeit
$dauer = differenz( $startzeit, microtime() );
$dauer = sprintf( "%0.6f", $dauer );
echo "<p>Der Benchmark dauerte {$dauer} Sekunden</p>";
?>

Variablen und Steuerungszeichen in Zeichenketten
Wenn man Variablen oder Steuerungszeichen innerhalb von Zeichenketten ausgeben möchte, muss man DQ benutzen. Wie wir weiter oben bereits gelernt haben, wird Text in SQ von PHP nicht mehr auf Variablen und Steuerungszeichen überprüft. Hier ein kleines Beispiel um das zu verdeutlichen:

<?php
$farbe      = 'braune';
$gegenstand = 'Ball';
 
echo "Der $farbe Hund beisst in den $gegenstand.";
// Gibt aus: Der braune Hund beisst in den Ball.
 
echo 'Der $farbe Hund beisst in den $gegenstand.';
// Gibt aus: Der $farbe Hund beisst in den $gegenstand.
?>

Soweit die Variablen, aber was sind Steuerungszeichen?

  • \n – Zeilenvorschub, bzw. Zeilenumbruch
  • \r – Wagenrücklauf
  • \t – Tabulator
  • \\ – Backslash
  • \$ – Dollar-Zeichen
  • \“ – Double Quotes
  • \xyz – xyz bedeutet ein Zeichen in Oktal-Schreibweise
  • \x00 – x00 bedeutet ein Zeichen in Hexadezimal-Schreibweise

Steuerungszeichen benötigt man meistens beim Schreiben in Dateien, formatieren von Quelltext im Browser oder auch um Zeichen darzustellen, die man auf normalem Weg nicht mit der Tastatur erzeugen kann.
Eine detaillierte Erklärung spare ich mir an dieser Stelle, weil Ihr am Ende des Artikels einen Link zur PHP Dokumentation findet, bei der Ihr alles nochmal genau nachlesen könnt.

Vorsicht Falle im Umgang mit Variablen!
Im letzten Beispiel haben wir die Variablen $farbe und $gegenstand direkt in einem String ausgegeben. Obwohl das, so wie wir es gemacht haben, nicht direkt falsch ist, birgt es aber dennoch eine Falle in sich, die man kennen sollte. Bei einfachen Variablen funktioniert die Ausgabe wie gewünscht. Versuchen wir mal ein weiteres Beipiel mit einem ganz simplen Element aus einem Array:

<?php
$benutzer = array( 'admin' => 'Klaus' );
echo "Wir begrüssen den neuen Admin $benutzer['admin'] in unserem Forum.";
?>

Wir weisen also dem Array-Schlüssel admin den Wert Klaus zu und geben anschliessend wieder einen String per echo aus, in dem wir den Name einsetzen möchten. Eigentlich würden wir erwarten das jetzt

Wir begrüssen den neuen Admin Klaus in unserem Forum.

ausgegeben wird. Aber statt dessen sehen wir etwas in der Art:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ...

Oops, da scheint etwas schief gelaufen zu sein!
Sobald der Parser ein Dollar-Zeichen ($) innerhalb einer Zeichenkette erkennt, versucht er aus allen nachfolgenden Zeichen eine gültige Variable zu erkennen, die er ersetzen kann. Dabei werden so viele Zeichen „aufgesaugt“ bis entweder eine Variable erkannt wurde oder ein Variablenname entsteht der ungültig ist, was unweigerlich zu einem Fehler führt.
Wenn wir also assoziative Array Elemente und/oder Eigenschaften von einem Objekt in einer Zeichenkette benutzen möchten, müssen wir dafür Sorge tragen, dass PHP diese Anreihung von Buchstaben als Ausdruck interpretiert. Mit anderen Worten: wir müssen PHP sagen was eine Variable innerhalb eines Strings ist!

Für diesen Zweck kann man einfache Variablen, Array Elemente und Objekt Eigenschaften in geschweifte Klammer setzen. Wenn PHP dann eine geschweifte Klammer, unmittelbar gefolgt von einem Dollar-Zeichen findet weiß der Parser, dass es sich um eine Variable handelt. Der Parser wird dann alle Folgezeichen bis hin zur schliessenden geschweiften Klammer als Ausdruck für eine Variable erkennen. Schauen wir uns das im Beispiel an:

<?php
$benutzer = array( 'admin' => 'Klaus' );
echo "Wir begrüssen den neuen Admin {$benutzer['admin']} in unserem Forum.";
// Gibt aus: Wir begrüssen den neuen Admin Klaus in unserem Forum.
 
 
$obj = new Klasse();
$obj->name = 'Klaus';
echo "Wir begrüssen den neuen Admin $obj->admin in unserem Forum.";
// Wird einen Parse Error erzeugen
 
echo "Wir begrüssen den neuen Admin {$obj->admin} in unserem Forum.";
// Gibt aus: Wir begrüssen den neuen Admin Klaus in unserem Forum.
?>

Merke:
Wenn man Variablen in Zeichenketten benutzt sollte man diese immer und konsequent in geschweifte Klammern stecken, weil man sich auf diese Art viel Ärger vom Hals halten kann!

Hinweis:
All das hier gesagt bezieht sich ausschliesslich auf Variablen. Es gibt keine Möglichkeit auf die selbe Art Konstante auszugeben!

Lesbarkeit von Code
Viele Programmierer verwenden Editoren mit farblicher Syntax-Hervorhebung – ähnlich wie diese Seite bei Code Beispiele. Diese Hervorhebung erhöht die Lesbarkeit von Code ganz enorm. So sieht man z.B. auf einen Blick was eine Zeichenkette, Variable, Funktion, Schlüsselwort, usw. ist.
Angesichts dessen ist es oftmals einfacher, wenn man Variablen nicht direkt in Zeichenketten ausgibt, sondern eine Zeichenkette unterbricht und mit dem Verknüpfung-Operator arbeitet. Das ist auch meine persönlich bevorzugte Variante. Schauen wir uns ein Beispiel an das dies verdeutlicht, dann kann jeder für sich entscheiden, welcher Weg bevorzugt wird.

<?php
$benutzer = array( 'name' => 'Klaus' );
$alter    = 26;
$wohnort  = 'Frankfurt';
 
// Variablen in der Zeichenkette
echo "Unser neuer Mitarbeiter {$benutzer['name']} ({$alter} J.) kommt aus {$wohnort} und wird das Entwickler-Team verstärken.";
 
// Variablen in unterbrochener Zeichenkette
echo "Unser neuer Mitarbeiter " .$benutzer['name']. " (" .$alter. " J.) kommt aus " .$wohnort. " und wird das Entwickler-Team verstärken.";
?>

Hier ist der Beispieltext sehr kurz gehalten. Je länger er wird, desto einfacher sind Variablen auszumachen, wenn die Zeichenkette unterbrochen wird. Code wird aber nicht nur lesbarer indem man ihn für Variablen unterbricht, sondern auch die Wahl der geeigneten Quotes in einer gegebenen Situation kann entscheidend sein.
Schauen wir uns mal eine fiktive Ausgabe einer automatisch generierten Webadresse an, wie man sie bei sehr vielen News Systeme sieht:

echo "<a href=\"news.php?kategorie={$kategorie}&id={$id}\" class=\"news\" title=\"{$newstitel}\">{$newstitel}</a>";

Wow, da muss man selbst als geüber Programmierer 2 bis 3 mal drauf schauen um zu sehen was da vor sich geht. Werden die Links jetzt nicht richtig ausgegeben fängt das Drama an. Variablen in der Zeichenkette, dazu jede Menge DQ die escaped werden müssen, da es sonst zu einem Parse Error kommt – das trägt nicht gerade zur Lesbarkeit bei.
Stricken wir das mal etwas um und schauen ob das nicht übersichtlicher geht:

echo '<a href="news.php?kategorie=' .$kategorie. '&id=' .$id. '" class="news" title="' .$newstitel. '">' .$newstitel. '</a>';

Die Zeile erscheint nun etwas länger, aber gleich um ein Vielfaches lesbarer, oder?! Durch das schlichte austauschen der Quotes von DQ zu SQ entfällt direkt das ganze escapen der DQ innerhalb der Zeichenkette. Dazu haben wir dann die Zeichenkette unterbrochen und die Variablen verknüpft (müssen wir ja, wegen den SQ!), so das diese auch hervorgehoben werden. Kleine Änderung, grosse Wirkung!

MySQL und Backticks
Wie weiter oben erwähnt, gibt es noch eine spezielle Art von Quotes. Eigentlich sind es gar keine und haben auch nicht direkt mit PHP zu tun, sondern sind eine Eigenheit von SQL. Was bei MySQL der Backtick ist sind etwa für SQLite, das auch die SQL Syntax benutzt, DQ oder auch eckige Klammern zum maskieren von Statements.
Es ist keine absolute Pflicht Backticks in SQL Statements zu verwenden, aber es kann einem sehr häufig eine Fehlersuche ersparen. Fehler die hier auftreten unterlaufen meist unerfahreneren Programmierern, die (noch) nicht allzu vertraut mit MySQL sind.

Angenommen wir haben eine ganz simple MySQL Anwendung auf unserer Hobby-Seite, die sich mit Fußball befasst. In unserer Tabelle in der Datenbank halten wir die Spieler-ID, den Spielername und die Summe der geschossenen Tore fest. Da wird faul sind (keine Ausreden, alle Programmierer sind das!) arbeiten wir natürlich mit Abkürzungen. Deswegen heissen die Felder in unserer Tabelle auch wie folgt: id, name, sum

Nun möchten wir eine Rangliste mit den meisten Toren ausgeben und dazu den Spielername. Also erstellen wir dafür unser Statement:

$sql = "SELECT name, sum FROM fussball ORDER BY sum DESC";

Das schicken wir so an die Datenbank und erwarten, dass wir eine Liste zurück bekommen in der der Spielername mit der Anzahl der Tore ausgegeben wird und zwar sortiert nach der Anzahl der Tore. Dummerweise bekommen wir stattdessen aber nur eine Fehlermeldung, dass wir einen Syntax Error in unserer Abfrage haben. Da können wir jetzt stundenlang drauf starren und grübeln, wieso ein Fehler kommt obwohl alles korrekt ist.
Der Fehler liegt darin, dass sum eine Aggregat-Funktion von MySQL ist, mit der man die Summe von Spalten ausrechnet. Dementsprechend ist es ein geschütztes Schlüsselwort und darf nicht einfach so als Spaltenname in einem Statement benutzt werden. Um dennoch an unser Ergebnis zu kommen, benutzen wir die Backticks.

$sql = "SELECT `name`, `sum` FROM `fussball` ORDER BY `sum` DESC";

Indem wir Feldnamen (und auch Tabellennamen) in Backticks einschliessen teilen wir MySQL mit, dass es sich hierbei nicht um den Aufruf der SQL-internen Funktion handelt, sondern um einen Feldname.
Man sollte immer konsequent diese Backticks benutzen, wenn man Statements an die DB schickt. Es gibt sehr viele geschütze Schlüsselwörter, viele von denen man nicht denken würde das es sie gibt. Tritt dann ein Fehler auf, sucht man sich doof und findet den Fehler trotzdem nicht.

Schlußwort
Ich hoffe das hat ein klein wenig Licht in’s Anführungszeichen-Dunkel gebracht und erspart dem ein oder anderen eine frustrierende Fehlersuche. Dieser Artikel war nur eine Zusammenfassung zum Thema Quotes. Eine ausführliche Beschreibung mit mehr Beispiele findet Ihr in der PHP Dokumentation.

Christof Servit Administrator
Inhaber und Entwickler bei servit.biz

Ich bin spezialisiert auf die Bereiche Webentwicklung, WordPress und .net Applikationen.
Dabei spielt es keine Rolle ob Frontend oder Backend (Full-Stack). Ich unterstütze meine Kunden bei der Enwicklung, Beratung und Einrichtung in allen Bereichen.

follow me
Entwickler gesucht? Ich kann Ihnen helfen.
Ich bin spezialisiert auf die Bereiche Webentwicklung, WordPress und .net Applikationen.
Dabei spielt es keine Rolle ob Frontend oder Backend (Full-Stack).
Jetzt kontaktieren

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Scroll to Top