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