Dienstag, 18. November 2008

<?php echo "intim" ?>

Ob der Titel wohl wieder dazu führt, dass ein weiterer SWA-Blog als Spamblog oder als nicht jugendfreier Blog eingestuft wird?

Dieser Eintrag stellt eine Premiere in meinem Blog dar: es ist der erste ganz ohne jeden Bezug zu einer Aufgabe.

In einem SWA Foren-Eintrag wurde einmal der Ratschlag gegeben, die einfachen Hochkommas beim Echo durch doppelte zu ersetzen.

In den meisten Fällen wird das gemacht, wenn man im echo-Text nochmals einfache oder doppelte Hochkommas ausgeben will. Wo aber liegt der Unterschied?

Strings unter einfachem Hochkomma werden von PHP nicht weiter geparst, sondern "raw" ausgegeben, solche unter doppeltem Hochkomma erst ausgewertet.

Beispiel:

$a=1;
echo '$a'; //Ausgabe: $a
echo "$a"; //Ausgabe: 1

Übrigens: echo ist keine Funktion! Unkreativerweise zitiere ich hier nur das offizielle PHP Manual:

echo() ist nicht wirklich eine Funktion sondern ein Sprach-Konstrukt, daher brauchen Sie keine Klammern verwenden. echo() verhält sich im Gegensatz zu einigen anderen Sprach-Konstrukten nicht wie eine Funktion, deshalb kann es nicht immer in einem Funktionskontext verwendet werden. Hinzu kommt, dass bei der Angabe mehrerer Parameter für echo() diese nicht von Klammern umschlossen sein dürfen.

Das hat eine besondere Auswirkung: die beiden folgenden Statements produzieren die gleiche Ausgabe, intern gibt es aber Unterschiede.

echo 'A'.'B'.'C'.'D';
echo 'A','B','C','D';

Einmal verwende ich also Punkte, dabei wird der String zusammengesetzt (A... AB... ABC... ABCD...) und erst dann ausgegeben (bzw. genau genommen eigentlich in den Output Buffer geschrieben).

Beim zweiten Mal verwende ich Kommas, dabei wird jeder Teil sofort ausgegeben. Das erspart Zeit und Speicher.

Möglich ist das wie gesagt nur deshalb, weil echo keine Funktion, sondern ein Konstrukt ist. Natürlich wird $a = 'a','b','c'; im Gegensatz zu $a = 'a'.'b'.'c'; NICHT funktionieren.

Draufgekommen bin über Umwege ich im Rahmen eines Seminars, bei dem ich PHP Obfuscator Software untersucht habe. Einige dieser Produkte produzieren "Bytecode" (eigentlich einen PHO Operation Cache), mit bcompiler kann man diesen dann aber "disassemblieren". Bei der Analyse einiger Skripte ist mir dieser Unterschied dann aufgefallen.

1 Kommentar:

Michael Derntl hat gesagt…

Der Titel dieses Blog Eintrags hat jedenfalls meine Liste der "Aktuellen Blog Einträge" auf der Homepage geknackt :-) Es kommen da ja Spitzklammern vor (der Browser meint dann es ist ein Tag). Für sowas kann man z.B. die PHP Funktion htmlspecialchars() verwenden. Das hatte ich vergessen für die Blog Titel...