Websiteentwicklung: PHP: Variablen

Aus Wikibooks

Bis jetzt war jeder Text, den wir auf dem Bildschirm ausgegeben haben, statisch. Das heißt, wir haben den Text, den wir ausgeben wollen, in einer PHP Datei gespeichert und dann mittels echo anzeigen lassen:

echo 'Dieser Text ist statisch';

Allerdings soll ein Nutzer die Möglichkeit haben, mit einem Skript zu interagieren. Dafür brauchen wir Variablen. Eine Variablen dient als Speicherort (bzw. Zeiger zu Speicherorten im RAM) für Informationen. Variablen werden in PHP immer mit einem Dollarzeichen ($) vor dem Variablennamen gekennzeichnet.


Variablentypen[Bearbeiten]

Anders als in anderen Programmiersprachen wie Pascal oder C++ muss in PHP nicht der Typ einer Variable definiert werden (z.B. int für eine Zahl oder String für einen Text) da PHP eine sogenannte Typ-schwache Programmiersprache ist.

Auch wenn PHP, wie schon gesagt, eine Typ-schwache Programmiersprache ist, heißt dies nicht, dass die Variablen keinen Typ haben, sondern dass der PHP-Interpreter die Typen der Variablen selbst festlegt. Dies macht es einerseits für Anfänger leichter, da diese sich keine Variablentypen merken müssen, andererseits führt es aber auch dazu, dass Variablentypen aus Versehen geändert werden können und der Programmierer nichts davon merkt. Generell sollte man den Typen einer Variable zur Laufzeit (also im Quellcode) nicht ändern, sondern notfalls eine neue Variable anlegen, welche die alte Variable beinhaltet aber vom anderen Typ ist.

Typen[Bearbeiten]

Auch wenn du selbst keine Variablentypen festlegst ist es notwendig, dass du weißt welche Typen die einzelnen Variablen haben. Variablen in einem PHP-Script können einen der folgenden Typen haben:

Normale Typen[Bearbeiten]

string, Zeichenketten Ein String besteht aus einer Kette von Zeichen, also einem Wort, einem Satz, einem Buchstaben, einem Text oder auch dem ganzen HTML-Quellcode (der ja auch nur eine Reihe/Kette von Zeichen ist). $var_str = 'Text';

integer, Ganzzahl Ein Integer ist eine normale Zahl die zwischen -2147483648 und +2147483647, diese Zahl kann keine Kommastellen haben. Bitte beachte, dass Integer ohne Anführungszeichen angegeben werden. $var_int = 12;

float/double, Fließkomma-Zahl Ein Float (oder auch double genannt, beide Typen sind allerdings in PHP gleich) ist eine Zahl mit Kommastellen. Das Komma wird bei den Programmiersprachen (die alle "Englisch" sind) allerdings zu einem Punkt. $var_float = 12.12;

boolean, Wahrheitswert Boolean ist ein Variablentyp mit zwei einfachen Werten, richtig oder falsch (true und false). Booleans werden in Bedingungen benutzt, alle Vergleichsoperatoren (mehr dazu im nächsten Kapitel) geben einen Boolean zurück. $var_bool = true;

Zusammengesetzte Typen[Bearbeiten]

array, Datenbereich Ein Array ist eine Gruppierung von einzelnen Variablen zu einer großen, mehr dazu im Kapitel Arrays.

object, Objekt Ein Objekt wird in der objektorientierten Programmierung benutzt, mehr dazu im Kapitel OOP (Objekt Orientierte Programmierung).

Spezialtypen[Bearbeiten]

resource Jedes mal, wenn man mit Systemressourcen, wie zum Beispiel Dateien, arbeitet, kommt man mit Variablen des Types resource in Verbindung. Diese Variablen beinhalten immer nur "Zeiger" zu den Systemressourcen und können nur von entsprechenden PHP-Funktionen verarbeitet werden.

NULL Dies ist sozusagen der Standardwert einer jeden Variable. Jede uninitialisierte (also noch nicht zugewiesene) Variable besitzt diesen Typ, man kann ihn allerdings auch durch eine Zuweisung auf NULL ($var = NULL;) oder durch die Benutzung der Funktion unset nachstellen.

Initialisierung[Bearbeiten]

In PHP müssen Variablen nicht notwendigerweise deklariert und initialisiert werden. (Dabei versteht man unter Deklarieren das Festlegen von Bezeichner und Datentyp, unter Initialisieren das Festlegen des Startwertes der Variablen.) Bei der ersten Verwendung einer Variable initialisiert und deklariert PHP diese Variable automatisch mit einer NULL-Referenz, das bedeutet eigentlich nichts anderes, als dass die Variable keinen Inhalt besitzt.

Explizite Initialisierung[Bearbeiten]

Eine explizite Deklaration und Initialisierung lässt sich natürlich ebenfalls machen und wird im Allgemeinen auch als saubere Programmierung betrachtet. Dabei wird allen Variablen vor ihrem ersten möglichen(!) Auftreten entweder ein neutraler oder ein Standard-Wert zugewiesen. Dies kann zum Beispiel am Anfang der Datei oder vor einer Schleife sein, in der die Variable verwendet werden soll. Die Zuweisung erfolgt generell über den Zuweisungsoperator =.

$variable = 0; // Deklaration und Initialisierung als INTEGER (Ganzzahl)
$text = "";  // string (Zeichenkette)

Die Variable $variable wird mit dem Wert 0 initialisiert. Die Variable $text wird mit einem leeren String initialisiert. Dieser Operator lässt sich auch bei späteren Manipulationen des Inhaltes verwenden, ist also nicht auf die Initialisierung einer Variable beschränkt. (siehe "Zuweisung")

Bedingte Zuweisung

Eine bedingte Zuweisung (auch: ternärer Operator) kombiniert eine Abfrage mit einer Zuweisung:

$wert = ($frage) ? $wahr : $falsch;

Wenn $frage wahr oder ein Äquivalent dazu ist, so wird der Variable $wert der Wert von $wahr zugewiesen, ansonsten der Wert von $falsch. Dabei können alle Variablen auch direkte Werte, Konstanten oder Ausdrücke sein. Diese Schreibweise ist für einfache Abfragen kompakter, als das Äquivalent über if-Abfragen:

if ($frage)
{
  $wert = $wahr;
}
else
{
  $wert = $falsch;
}

Das folgende Beispiel weist der Variable nur einen Standard-Wert zu, wenn sie nicht existiert, also nicht deklariert wurde.

$wert = (isset($wert)) ? $wert : "standard";

Zuweisung[Bearbeiten]

Die Zuweisung erfolgt durch den Zuweisungsoperator in Gestalt des Ist-Gleich-Zeichens (=):

$text = 'Hello World';
$eine_zahl = 42;

Nach der Zuweisung erhält die Variable text den String "Hello world" und die Variable eine_zahl den Wert 42.

Statt einem festen Ausdruck kann man auch z.B. den Inhalt einer anderen Variable in eine Variable speichern:

$text1 = 'Hello World';
$text2 = $text1;

Damit erhält auch die Variable text2 die Zeichenkette "Hello World".

Dieses Zuweisung kann man auch anders lösen:

$text1 = $text2 = "Hello World";

Nun enthalten die Variablen text1 und text2 die Zeichenkette "Hello World". Dies ist von Vorteil, wenn man zwei Zuweisungen mit der gleichen Zeichenkette benötigt. Man spart somit eine Zuweisung.

Wenn man an einen String eine weitere Zeichenkette anhängen will, so kann dies mit einem .= erreicht werden:

$text = 'Hello ';
$text .= 'World!';
// analog:
// $text = $text . 'World!';

Die Variable $text würde jetzt Hello World! beinhalten. Der Zuweisungsoperator .= ist eine Kombination aus dem Zuweisungsoperator = und dem Vereinigungsoperator ., welcher zwei Ausdrücke miteinander verbindet. Alternativ hätte man auch Folgendes schreiben können:

$text = 'Hello '.'World!';


Jetzt haben Sie gelernt, wie man Variablen zuweist. Das folgende Programm gibt die Variable aus:

$text = 'Hello World!';
echo $text;

Es wird Hello World! ausgegeben. Beachten Sie bitte, dass die Ausgabe von Variablen ohne Hochkommata oder Anführungsstriche erfolgt.

Wenn man bei einer Ausgabe Text und Variablen kombinieren will, sieht dies mit Hochkommata wie folgt aus:

$text = 'Hello World!';
echo 'Der Computer sagt '.$text;


Innerhalb von Anführungszeichen aber werden Variablen geparst (Englisch: parsed), also vom Interpreter gegen die ihnen zugewiesenen Werte ausgetauscht:

$text = 'Hello World!';
echo "Der Computer sagt $text";

In beiden Fällen wird Der Computer sagt Hello World! ausgegeben.

Aus bestimmten Gründen, von denen der einfachste die Verwendung von XHTML-Attributen mit zwingend vorgeschriebenen Anführungszeichen ist, wird es immer wieder vorkommen, dass man das Parsen blockierende Hochkommata und das Parsen erlaubende Anführungszeichen zu kombinieren hat. Auch in unserem Beispiel könnte man diese Kombination anwenden, um die direkte Rede korrekt darzustellen:

$text = "'Hello World!'";
echo '"Der Computer sprach die Worte ' . $text . ' zu uns."';

Mit diesem Code wird "Der Computer sprach die Worte 'Hello World!' zu uns." ausgegeben.

Um beim Schreiben nicht zu sehr verwirrt zu werden, was Programmablauf und was Werte sind, bietet sich ein Editor mit Syntaxhervorhebung (Englisch: Syntax highlighting) an. Damit sind beide Elemente leicht voneinander zu unterscheiden.

Referenzierung[Bearbeiten]

Variablen sind nicht gleichzusetzen mit dem Inhalt, den sie besitzen. Eine Variable mit dem Inhalt "Hallo Welt" ist also nicht identisch mit der Zeichenkette, sondern verweist bloß auf die Speicherstelle, die den Inhalt speichert. Für den praktischen Einsatz macht dies keinen Unterschied, da PHP durch den Aufruf der Variable gleich auf den Inhalt verweist. Man kann allerdings auch direkt auf die Referenz verweisen, indem man den Referenz-Operator "&" nutzt. So verweist &$foo nicht auf den Inhalt der Variable $foo, sondern auf deren Speicherstelle.

$foo = 1;
$bar = 2;
echo $bar;  // Ausgabe "2"
$bar = &$foo;
echo $bar;  // Ausgabe "1"
$foo = 42;
echo $bar;  // Ausgabe "2"

Dies wird allerdings erst wirklich interessant für Funktionen und Objekte. Ansonsten ergibt es wenig Sinn, für eine Speicherstelle zwei Variablen zu nutzen.

Konstanten[Bearbeiten]

Es gibt immer wieder Situation, in denen man es mit einer „Variablen“ zu tun hat, welche sich nicht ändern soll. Solche Variablen haben also immer den gleichen Wert, der Wert bleibt konstant. Man nennt sie daher nicht Variablen, sondern Konstanten. Der Zugriff und das Speichern von Konstanten ist anders als bei Variablen. Man benutzt zum Definieren die Funktion define, zum Lesen einer Konstanten gibt man einfach nur den Namen der Konstante an ohne das Dollarzeichen!

define('KONSTANTE', 'WERT');
echo KONSTANTE; // Kein $ Zeichen!
echo "Diese Aussage hat einen ". KONSTANTE;

Konstanten werden, damit man sie besser erkennen kann, immer groß geschrieben, und mehrere Wörter durch einen Unterstrich getrennt. Für die Konstanten existiert kein Zugriffsbereich wie für Variablen, sie können von überall gelesen werden.

Mehr über Konstanten im entsprechenden Kapitel.

Dynamische Variablen[Bearbeiten]

Manchmal kommt es vor, dass man eine Variable benötigt, deren Name sich ändert, je nachdem was für ein Code davor ausgeführt wurde. Damit man nicht für jede Variable überprüfen muss, ob diese nun gesetzt ist, gibt es dynamische Variablen. Die dynamische Variable unterscheidet sich nur insofern von normalen Variablen, als beim Angeben des Variablennamens eine weitere Variable benutzt wird. Allerdings erhöhen dynamische Variablen die Zeit für nachträgliche Änderungen meist stark und sollten daher nur in besonderen Fällen verwendet werden.

$varname = 'test';
$test = 'Hallo';
echo $$varname; // Ausgabe: Hallo

Zuerst wird eine Variable definiert welche den Namen der benötigten Variable beinhaltet und dann die Variable mit dem Namen. Am Schluss wird dann zuerst das "innere" $varname zum String "text" umgewandelt und dann der Inhalt der neuen Variable $test ausgegeben.

Wie schon bei den Variablen in Strings gibt es auch hier das Problem, dass eine dynamische Variable vielleicht nur teilweise dynamisch ist. Das folgende Beispiel verdeutlicht das Problem:

$varname = 'test';
$dieser_test_ist_toll = 'Test Ausgabe';
echo $dieser_$varname_ist_toll; // Würde zu einem Fehler führen, weil die Variable $varname_ist_toll
                                // nicht existiert.

Der Name der Variable kann genauso wie bei den Strings auch hier in geschweifte Klammern gesetzt werden, um genau zu kennzeichnen, wo die Variable anfängt und wo sie aufhört.

echo $dieser_{$varname}_ist_toll; // Ausgabe: Test Ausgabe

Dynamische Variablen kommen sehr selten zum Einsatz, da sie nur in besonderen Situationen erforderlich sind.

Übungen[Bearbeiten]

So, nun wieder eine kleine Aufgabe, damit du prüfen kannst, ob du aufmerksam gelesen hast:

  • In einem Script soll eine Konstante mit der Zahl 5 existieren und eine Variable mit 4. Diese beiden sollen addiert und dann ausgegeben werden. Wird der Wert der Variable oder Konstante verändert, soll sich das Ergebnis automatisch anpassen.