phpbar.de logo

Mailinglisten-Archive

[php] Index von Arrays führen zu <Notes>

[php] Index von Arrays führen zu <Notes>

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Sam Mar 17 16:05:35 CET 2007


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