" und ' in php

Hi Leute,
ich bin gerade dabei PHP zu lernen und Frage mich, worauf kommt es an ob man einfach hochkommas, also ‘text’ oder anführungsstriche, sprich “text” setzt?

Mit " " werden Variablen ($var) und Sonderzeichen \n \r \t \x00-\xFF im String geparst:

$var1 = ' Hallo $test \r\n Test';
$var2 = "Hallo $test \r\n Test";

echo $var1;
echo "\r\n------\r\n";
echo $var2;

Probiers mal :wink:

Deswegen sollte man sich auch angewöhnen, Strings ohne Escape-Sequenzen und dergleichen (zumindest bei größeren Projekten) grundsätzlich in ‘single quotes’ zu packen - das spart dem Parser die Arbeit, den String nach Variablen und Escape-Sequenzen zu durchsuchen. :wink:

Moin,

generell wäre das zwar logisch, aber es gibt Tests, die „beweisen“, dass doppelte Anführungszeichen schneller geparst werden - andere Test beweisen das Gegenteil :p

Da es in dem Sinne nun keine wirklichen Beweise gibt, liegt es vielmehr am Stil des Coders, welche Anführungszeichen er benutzt.

Es stimmt, dass man bei doppelten Anführungszeichen den Vorteil hat, dass man Variablen einfach hineinsetzen kann und bei den einfachen wird der Quelltext meistens doch übersichtlicher, wobei man da halt dann drauf achten muss, dass man Variablen, etc. an den String per Interpunktierung (.)

$var = 'Variablen';
echo 'Simpler Text mit einer'.$var;

anhängt.

Fazit: In der Regel gibt es keine Empfehlung. Jeder hat seinen eigenen Stil, aber man sollte sich bewusst überlegen, ob es Sinn macht doppelte Anführungszeichen zu verwenden. Ein Beispiel für sinnlose Praxis wäre:

include("meinedatei.html");

Da es bei diesem Befehl meisten keine Variablen in einen String eingefügt werden bzw. die Variable bereits den Namen der Datei enthält, macht es kaum Sinn doppelte Anführungszeichen zu verwenden - einfache würden hier genügen.

MfG
myPages

Ich schreibe immer " ", da ich die Taste auf der Tastatur schneller finde…

Jetzt programmiere ich auch in C++, da darf man keine " " verwenden, da sonst automatisch ein 0 - Zeichen (\0, mit PHP \x00) angehängt wird :frowning:

“a” == 'a\0’
Das ganze passt dann nicht in ein char, und es gibt einen Fehler

oder so…

Also zu meinen ganz persönlichen Coding-Guidelines zu PHP gehört es, dass ich Double-Quotes nur setze, wenn ich auch will, dass darin auch Variablen ersetzt haben will, so kann ich schon am ersten Zeichen sehen, ob es sich um einen statischen Ausdruck handelt, oder nicht.
Ich finde es so am praktischsten.

Und zum Thema Geschwindigkeit, ich kann dir einen Test schreiben bei dem Double-Quotes schneller sind, ich kann dir auch einen Test schreiben bei dem Single-Quotes schneller sind, je nachdem, was dir lieber ist :wink:

Mach mal:

$single=0;
$double=0;

for($i=0;$i<100;$i++)
{
   $time = microtime(true);
   $a = "abcdefghijklmnopqrstuvwxyz";
   $double += microtime(true)-$time;
   $time = microtime(true);
   $a = 'abcdefghijklmnopqrstuvwxyz';
   $single += microtime(true)-$time;
}
echo "Einfache: ".round($single,10)." --- Doppelte: ".round($double,10);

Mal sehen…

Ergebnisse:
Einfache: 0.000110149384 — Doppelte: 0.000107049942
Einfache: 0.000107765198 — Doppelte: 0.000108242035
Einfache: 0.000108718872 — Doppelte: 0.000109672546
Einfache: 0.000107049942 — Doppelte: 0.000108480453

Schlussfolgerung: Das bleibt sich sowas von egal…

Dein Test ist nicht Aussagekräftig, es ist kein fairer Vergleich.

[code]$single=0;
$double=0;
$data = 3.1459;
$data2 = ‘Hello World’;

for($i=0;$i<1000000;$i++)
{
$time = microtime(true);
$a = “abcdefg{$data}hijklmnop{$data2}qrstuvwxyz”;
$double += microtime(true)-$time;
$time = microtime(true);
$a = ‘abcdefg’ . $data . ‘hijklmnop’ . $data2 . ‘qrstuvwxyz’;
$single += microtime(true)-$time;
}
echo "Einfache: “.round($single,10).” — Doppelte: ".round($double,10);[/code]

Einfache: 3.1939675808 — Doppelte: 3.3378713131
Einfache: 3.1212854385 — Doppelte: 3.3024482727
Einfache: 2.9860785007 — Doppelte: 3.1394882202

Und jetzt noch ein Test zu Gunsten von Double-Quotes:

[code]$single=0;
$double=0;
$data = 3.1459;
$data2 = ‘Hello World’;

for($i=0;$i<1000;$i++)
{
$time = microtime(true);
print “abcdefg{$data}hijklmnop{$data2}qrstuvwxyz”;
$double += microtime(true)-$time;
$time = microtime(true);
print ‘abcdefg’ . $data . ‘hijklmnop’ . $data2 . ‘qrstuvwxyz’;
$single += microtime(true)-$time;
}
echo "Einfache: “.round($single,10).” — Doppelte: ".round($double,10);[/code]
Einfache: 0.1326184273 — Doppelte: 0.1177999973
Einfache: 0.1700117588 — Doppelte: 0.1302435398
Einfache: 0.1565761566 — Doppelte: 0.1155714989

Aber Fazit bleibt gleich :wink:
Diese String-Funktionen sind so schnell, da macht es keinen Unterschied
Wenn eine Var-Zuweisung 0,000003194 Sekunden braucht…

Genau :slight_smile:

Hm, nach meiner Erfahrung sind double quotes besser mit Variablen und single quotes besser ohne - Konkatenation ist imho langsamer als „inline“-Variablen. Die ermittelten Werte ändern sich irgendwie auch immer wieder… auch ka, hier jedenfalls 2 Benchmark-Scripte:
[ul]
[li]http://scram.bplaced.net/testy/bench.php[/li]
[li]http://scram.bplaced.net/testy/bench2.php[/li][/ul]
Meine Ergebnisse:

[ul]
[li]Mit Variablen
[list]
[]Single quotes: float(1.6135568618774)[/li]
[li]Double quotes: float(0.83729386329651)[/li][/ul][/
:m]
[li]Ohne Variablen
[ul]
[]Single quotes: float(0.329745054245)[/li]
[li]Double quotes: float(1.2085189819336)[/li][/ul][/
:m][/list:u]
Hatte aber auch schon andere Ergebnisse, das scheint auch zu schwanken. :neutral_face:

ihr diskutiert so viel, das ihr längst an der tatsächlichen frage von comjag vorbeigerauscht seid… der wollte mehr oder weniger nur den zweck von ’ ’ und " " wissen :ps:

Hallo,

nach einer Woche ohne Forum, möcht ich dazu auch mal was sagen.
Also warum man “” oder ‘’ wurde ja nun schon ausreichend geklärt.

Nun möcht ich einfach mal in den Raum stellen, dass der Vorteil von geparsten Variablen in “”, dem Nachteil gegenüber steht, alle anderen " in diesem String escapen zu müssen, was gerade bei HTML Code in einem String ziemlich lästig sein kann.
Bsp:

$var = "blubb";
echo "hier sieht man einen $var ...";
//Ausgabe:
hier sieht man einen blubb ...

möchte man das ganze nun irgendwie noch formatieren kann die Arbeit auch schon los gehen:

$var = "blubb";
echo "hier sieht man einen <div style=\"nix\" id=\"\"><span style=\"nix\" id=\"\">$var</div> ...";
//Ausgabe:
hier sieht man einen [Format]blubb[/Format] ...

Desto mehr man macht, desto unübersichtlicher wird das ganze, meiner Meinung nach.
Ich verwende deswegen, vorwiegend nur noch die ‘’ und interpunktiere die Variablen dann einfach

$var = 'blubb';
echo 'hier sieht man einen <div style="nix" id=""><span style="nix" id="">'.$var.'</span></div> ...';
//Ausgabe:
hier sieht man einen blubb ...

zumal die interpunktion der Variablen, den Vorteil hat, dass gängige SyntaxHL Editoren, Variablen einfacher als solche erkennen und somit deutlicher hervorheben. Das mag bei den kleinen Projekten alles nicht ins Gewicht fallen. Wer größeres macht, legt irgendwann aber einfach Wert auf übersichtlichen Quellcode.
Die Geschwindigkeitsdiskusion hier, ist hingegen vollkommen lächerlich und überhaupt nicht angemessen. Wenn man anfängt auf solch kleine Details zu achten, solltet ihr lieber mal eure Codes anschauen und die sinnvoller strukturieren. Ein unsauberer Code, benötigt immernoch die meiste Ausführungszeit.

Greez

Da hab ich einen kleinen Trick(den kennt ihr warscheinlich noch nicht):

$var=<<<TEXT <p>Hallo<p>
<p class="hinweis">Das ist ein Beispiel über mehrere Zeilen</p>
<p class='Hinzufügung'>Das geht sogar!!!</p>
TEXT;

Die Heredoc-Syntax kenne ich schon, aber die benutze ich im Allgemeinen nicht, da man sie 1. nicht einrücken kann, sie 2. die meisten Syntax-Highlighter fux0rt und 3. meiner Meinung nach den Code unleserlich macht, schon wegen Punkt 1 und 2.

Ein alternatives Quotingverfahren für PHP bräuchte es… Perl und Python sind da schon viel weiter. !haue

Also mit folgende Programme zeigen das ganze Problemlos an:
[ul]
[li]Quanta+[/li]
[li]Notepad++[/li]
[li]phpDesigner[/li]
[li]Standard-GNome-Editor :smiley: [/li][/ul]

Also ich benutze das eigentlich gerne, wenn ich mal ein wenig mehr Text ausgeben will, auch wenn das ziemlich selten vorkommt, da eigentlich immer besser ist Templates zu benutzen.
Dass man dabei den Text nicht einrücken kann stört mich nicht sonderlich, dank Syntax-Highlighting sieht man schnell worum es sich handelt, außerdem kann man den Code in der ersten Zeile ja einrücken, besser als nichts.

oder man verwendet str_replace("\t","",$xyz)