2016-12-24 5 views
4

The PHP manual says:Uninitialized Variablen in PHP

Es ist nicht notwendig Variablen in PHP zu initialisieren aber es eine Praxis sehr gut. Nicht initialisierte Variablen haben einen Standardwert von ihren Typ abhängig von dem Kontext, in dem sie verwendet werden - booleans Standard auf FALSE, Integer und Floats standardmäßig auf Null, Zeichenfolgen (zB in Echo verwendet) werden als leere Zeichenfolge und Arrays werden zu einem leeren Array.

Ich spielte mit nicht initialisierten Variablen für Golf, aber das Programm hat nicht getan, was ich erwartet hatte. Bei der Untersuchung bemerkte ich dieses seltsame Verhalten (alle verwendeten Variablen sind nicht initialisierten):

php > $a = $a + 1; 
PHP Notice: Undefined variable: a in php shell code on line 1 
php > $b = $b - 1; 
PHP Notice: Undefined variable: b in php shell code on line 1 
php > $c++; 
PHP Notice: Undefined variable: c in php shell code on line 1 
php > $d--; 
PHP Notice: Undefined variable: d in php shell code on line 1 
php > var_dump($a); 
int(1) 
php > var_dump($b); 
int(-1) 
php > var_dump($c); 
int(1) 
php > var_dump($d); 
NULL 

+ 1, - 1 und ++ Arbeit, wie im Handbuch beschrieben. -- jedoch nicht.

$a, $b und $c kann zum Zählen verwendet werden, danach. Aber $d--;, ändert sich nicht $d Wert, weil $dNULL ist.

Warum ist $d auf NULL eingestellt, nicht auf -1?

Präfix Operatoren liefert die gleichen Ergebnisse, btw .: Die Variable 1 für ++$v; gesetzt ist, aber auf NULL für --$v;.

Antwort

1

Vom manual:

Hinweis: ... Dekrementieren NULL-Werte keine Auswirkung zu hat, sondern sie ergibt 1.

So unitialized Variable erhalten einen NULL-Wert erhöht wird. Wenn Sie diesen Wert erhöhen, erhalten Sie die 1 (als NULL + 1). Der Versuch der Dekrementierung hat jedoch keine Auswirkungen, wie in der Dokumentation beschrieben.

Auch gibt es eine sehr good explanation im relevanten Thema.

Es mag zwar widersprüchlich erscheinen, aber es ist eine Konsequenz des Typisierungsmodells der Sprache. Um dieses Verhalten zu vermeiden, befolgen Sie einfach die bewährten Methoden: initialisieren Sie immer eine Variable und achten Sie auf arithmetische Operationen auf die nicht-numerischen Werte.

+0

Das Dekrementieren einer Variablen unterscheidet sich also von der Subtraktion von 1, oder? Andernfalls würde '$ v = $ v - 1;' auch '$ v' auf' NULL' setzen. Können Sie das näher erläutern und vielleicht auch erläutern, wie das beschriebene Verhalten eine Folge des PHP-Tippmodells ist? –

+0

> Dekrementieren einer Variable unterscheidet sich von Subtraktion 1 - genau – Timurib

+0

Leider weiß ich nicht _Why_ NULL Werte verhält sich so mit Dekrement. Vielleicht hat gerade jemand entschieden, dass es so sein sollte :) – Timurib