Basilius-Network

Das offizielle Forum zum Basilius-Network und aller Komponenten.
Aktuelle Zeit: Di 7. Sep 2010, 20:25

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Array-Schlüssel
BeitragVerfasst: So 8. Jul 2007, 15:49 
Offline
Administrator

Registriert: Do 24. Mai 2007, 21:18
Beiträge: 35
Wohnort: Riehen (CH)
Engelsreich-Charakter: Charakter vorhanden
Charakternamen: Sefardius, Schlumpf, Testi
Lässt man sich mit error_reporting() alle Fehler, Warnungen und Notizen anzeigen, so kann es bei LoGD durchaus sein, dass solcherlei Meldungen auftauchen - und das nicht zu knapp:

Zitat:
Notice: Use of undefined constant user - assumed 'user' in ~/logd/common.php on line 102


Doch was bedeutet das?

Der Fehler lässt sich ganz einfach auf folgendes Konstrukt zurück führen:
Code:
print $session[user][gold];

Viele Male anzutreffen. Es ist falsch, fehleranfällig. Oder anders ausgedrückt: Weg damit!
Korrekterweise schreibt man das so:
Code:
print $session['user']['gold'];

So ist es unmissverständlich für den Interpreter, was gemeint ist.

Aber ersteres funktioniert ja. Warum soll man dann das zweite verwenden? Ist doch viel mehr Schreibarbeit?
Ganz einfach: Es ist, wie schon erwähnt, falsch und fehleranfällig. Vergisst man, die Array-Schlüssel zu escapen, so meint PHP korrekterweise, dass es Konstanten sind. So werden Konstanten gesucht, und wenn es keine gibt, ahnt PHP, dass man schlichtweg die Anführungsstriche vergessen hat und nimmt an, dass es ein String sein soll.
Gibt es aber nun dieses Wort als Konstante, so bekommt der ganze Code eine neue Bedeutung und wird anders ausgeführt, als man annimmt. So etwas lässt sich vermeiden!
Um zu zeigen, was ich meine, hier ein Stück Beispielquellcode:
Code:
$session['user'] = array( "gold" => 50, "gems" => 3);
print $session[user][gold];
print $session['user']['gold'];

define('gold','gems');
print $session[user][gold];
print $session['user']['gold'];

Zuerst wird ein Array definiert mit den Elementen "gold" und "gems", beide haben verschiedene Werte. "gold" den Wert 50, "gems" den Wert 3.
Dann wird auf die Falsche Weise das Gold ausgegeben. Erwartungsgemäss 50. Auf Zeile 3 wird auf die korrekte Weise das Gold ausgegeben mit dem gleichen Ergebnis.
Auf Zeile 5 definieren wird die Konstante "gold", welche den Wert "gems" bekommt.
Auf Zeile 6 wieder das gleiche wie auf Zeile 2: Die falsche Version zur Ausgabe. Man erwartet, dass 50 ausgegeben wird - wird aber nicht. PHP leitet "3" an die Ausgabe. Zeile 7 gibt wieder das korrekte Ergebnis aus. Aber warum nochmal?

Genau. Der Interpreter nimmt an, dass "gold" in Zeile 2 und 6 eine Konstante ist. Bei Zeile 2 gibts keine Konstante, die auf diesen Namen hört, somit nimmt PHP an, dass es ein String ist und gibt das erwartete Ergebnis von 50 aus. Bei Zeile 6 gibts aber die Konstante "gold". PHP nimmt den Wert dieser Konstante, "gems", und sucht den Array-Schlüssel mit dem Namen "gems". Der Wert von "gems" ist 3, wie wir in Zeile 1 definiert haben, das Ergebnis somit 3.

Achtung!
Bei Arrays in Strings verhaltet es sich etwas anders. Will man die vorherige, korrekte Schreibweise in einem String gebrauchen, dann wird keine Notiz geworfen, sondern ein Fataler Fehler:
Code:
print "Der Apfel ist $Apfel['Farbe']";

Schreibt man Arrays so in Strings, dann kann man das auf 2 korrekte Art und Weise tun. Entweder so, wie wir es vorher gelernt haben, wie man es eigentlich nicht tut:
Code:
print "Der Apfel ist $Apfel[Farbe]";

Oder so, mit geschweiften Klammern:
Code:
print "Der Apfel ist {$Apfel['Farbe']}";

Ersteres ist keineswegs falsch, der PHP-Interpreter sucht hier nicht nach ner Konstante. Trotzdem sollte zweite Möglichkeit genommen werden, da der PHP-Interpreter nur eindimensionale Arrays in Strings findet, nicht aber mehrdimensionale. Mit den Klammern findet er auch mehrdimensionale:
Code:
print "Der $Frucht[Apfel][Name] ist $Frucht[Apfel][Farbe]";
print "Der {$Frucht['Apfel']['Name']} ist {$Frucht['Apfel']['Farbe']}";

Die erste Zeile wird folgendes Ausgeben, wider Erwarten:
Zitat:
Der Array[Name] ist Array[Farbe]

Und die Zweite, erwartungsgemäss:
Zitat:
Der Apfel ist gelb


PS: Wer es mir noch immer nicht glaubt, der kann in einer Testumgebung folgendes Experiment versuchen:
Suche [common.php]:
Code:
$output = "";

Füge danach ein:
Code:
define('user', 'none');

Huch...


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de