Mailinglisten-Archive |
Hi Andreas, Am Samstag, 17. März 2007 14:21 schrieb Andreas Ahlenstorf: > Am 17.03.2007 um 11:55 schrieb Lutz Zetzsche: > > Richtig soweit? :-) > > Erm... bei meiner Erklärung ging's eher darum, warum foo(& > $undefined_var) keine Notice wirft. Sonst ist's relativ einfach: Es > kann nur auf Ebene der Engine geprüft werden, ob eine Variable > existiert oder nicht, ohne dass es eine Notice beim Variablenzugriff > gibt. Darum brauchen wir isset() und empty(). > > > Wenn PHP innerhalb von isset vor der Evaluierung schon automatisch > > einen > > Eintrag in die Symboltabelle macht, wie kann die Funktion dann noch > > herausfinden, daß die Variable vielleicht nicht existiert? Wo merkt > > sich PHP das, daß es den Eintrag in die Symboltabelle erst > > innerhalb von isset gemacht hat? Bzw. wie Symboltabelle aus? Steht > > da vielleicht drin, "wer" wann den Eintrag gemacht hat? > > isset() macht keinen Eintrag in die Symboltabelle, sondern foo(& > $undefined_var). > > $ php -r 'error_reporting(E_ALL); function foo(&$undef) { var_dump > (isset($undef)); } foo($bar); ' > bool(false) > $ php -r 'error_reporting(E_ALL); function foo($undef) { var_dump > (isset($undef)); } foo($bar); ' > > Notice: Undefined variable: bar in Command line code on line 1 > bool(false) ausnahmsweise Vollzitat... :-) Mir drängt sich nämlich gerade ein leiser Verdacht auf: Ich habe Euch falsch verstanden, Ihr habt mich nicht verstanden usw. ;-( Ich glaube, ich muß also noch mal von vorne anfangen, weil ich es einfach nur einmal richtig verstehen möchte, was isset() intern macht und warum es keine Fehlermeldung ausgibt, wenn es eine undefinierte Variable "übergeben" bekommt. Es scheint nicht so ganz einfach, wenn man keine Ahnung von den internen Abläufen in PHP hat. :-( Ich hoffe, Ihr verzeiht mir. :-) Von außen kann ich folgendes beobachten: isset($undefVar) wirft keine Fehlermeldung aus, echo $undefVar hingegen schon. isset($undefVar) prüft auf die Existenz der Variable, echo $undefVar gibt den Wert der Variablen aus, sofern sie definiert ist. Beide Male wird also nur $undefVar übergeben, einmal wird aber mit der Referenz und mal mit dem Wert gearbeitet. Ich hoffe, die Formulierung ist so korrekt. Betrachte ich nun Funktionen, so ist der Funktionsaufruf ja sowohl bei call-by-value als auch bei call-by-reference gleich. Ob der Übergabeparameter als Referenz oder als Wert interpretiert werden soll, ergibt sich erst aus der Funktionsdeklaration: function testf($param) { ... } function testf(&$param) { ... } Ich habe hier also beim Aufruf eine analoge Konstellation wie bei isset() und echo. Den Unterschied gibt es nun bei der Deklaration: Bei der Deklaration der Sprachkonstrukte ist keine Rede von Referenz oder Wert. Daraus schließe ich jetzt einmal, daß isset weiß, daß es bei $undefVar um die Referenz geht, und echo weiß, daß es bei $undefVar um den Wert geht, weil der Entwickler das so programmiert hat. :-) Nun geht isset hin und prüft, ob es zu $undefVar einen Eintrag in der Symboltabelle gibt oder nicht und liefert entsprechend TRUE oder FALSE zurück. echo hingegen, welches mit dem Wert arbeiten will, wirft eine Fehlermeldung aus, wenn der Eintrag nicht existiert. Funktionen verhalten sich so, daß wenn eine Variable als Referenz übergeben wird, automatisch einen Eintrag in die Symboltabelle machen, weshalb es keine Fehlermeldung gibt, und wenn eine Variable als Wert übergeben wird, verhält es sich wie bei echo. Wenn ich das jetzt so richtig betrachte, liegt mein Verständnisproblem wohl darin begründet, daß Sprachkonstrukte genauso wie Funktionen in Wirklichkeit ja gar nicht eine Variablen-Referenz oder einen Variablen-Wert übergeben bekommen, sondern einfach nur einen Variablen-Bezeichner. Und erst die konkrete Implementierung entscheidet, ob in einem Konstrukt über den Bezeichner auf eine Referenz zugegriffen wird oder auf einen Wert. Habe ich es jetzt richtig auf die Reihe bekommen? :-) Viele Grüße Lutz
php::bar PHP Wiki - Listenarchive