PHP-Autovivifizierung

8

Update: Meine ursprüngliche Absicht für diese Frage war festzustellen, ob PHP diese Funktion tatsächlich besitzt. Dies wurde in den Antworten auf das Skalarproblem verloren. Bitte sehen Sie stattdessen diese neue Frage: "Hat PHP Autovivification?" Diese Frage ist hier für Referenz.

Laut Wikipedia hat PHP keine Autovivizenz, aber dieser Code funktioniert:

%Vor%

Ausgabe:

%Vor%

Ich fand, dass dieser Code auch funktioniert:

%Vor%

Aber das Hinzufügen dieser Zeile verursacht eine Warnung ("Warnung: Kann keinen Skalarwert als Array verwenden")

%Vor%

Was ist hier los? Warum schlägt es fehl, wenn ich das assoziative Element nach dem Index hinzufüge? Ist das "wahre" Perl-ähnliche Autovivification, oder eine Variation davon, oder etwas anderes?

Edit: Oh, ich sehe jetzt den Fehler mit dem Skalar, hoppla! Diese funktionieren wie erwartet:

%Vor%

Also, php hat Autovivifikation? Google nach "php autovivification" zu durchsuchen bringt keine kanonische Antwort oder ein Beispiel dafür.

    
Ollie Glass 11.05.2011, 09:50
quelle

3 Antworten

6

Aus dem PHP-Handbuch zur Syntax der eckigen Klammer:

  

$arr[] = value;

     

Wenn $arr noch nicht existiert, wird es erstellt, also ist dies auch eine alternative Möglichkeit, ein Array zu erstellen

Mit Ihrem Beispiel:

%Vor%

Da $test und $test['a'] derzeit nicht existieren; Sie werden beide als Arrays erstellt.

%Vor%

$test['b'] und $test['b'][4] sind derzeit nicht vorhanden. Sie werden beide als Arrays erstellt.

%Vor%

$test['a'][4] ist vorhanden, aber es ist eine ganze Zahl ( 1 ). Dies ist der "Skalarwert", der nicht als Array verwendet werden kann. Sie können die eckige Klammer [] -Syntax nicht für Zahlenwerte verwenden. Es konvertiert einen vorhandenen Wert nicht in ein Array.

    
lonesomeday 11.05.2011, 09:59
quelle
2

Laut den Ergebnissen hat PHP Autoviviblisierung. Der Fehler kommt von der Art, wie es funktioniert.

Wenn Sie sagen: $ a [1] [2] = 55, möchte PHP die 55 in $ a [1] als [2] = & gt; 55 einfügen. Da das $ a [1] nicht existiert, erstellt PHP automatisch einen leeren Knoten , cca. $ a [1] = Array (). Aber wenn der Knoten bereits existiert, erstellt PHP $ a [1] nicht, sondern führt nur die [2] = & gt; 55 aus, was ein Fehler ist, wenn $ a [1] nicht arrayähnlich ist (Array, Objekt).

Die letzte Sprache, die ich gesehen habe, wo Knoten Werte und auch Kinder haben können, ist MUMPS. Es gab auch eine Funktion namens $ DATA (), die sagte, ob ein Knoten ein untergeordnetes Element (10), einen Wert (1) oder beides (11) hat oder nicht existiert (0). Ich denke, das ist die korrekte Behandlung von assoziativen Arrays.

(Wie auch immer, ich mag dieses Verhalten von PHP.)

    
ern0 11.05.2011 10:08
quelle
1

Mit:

%Vor%

Sie fügen kein Element zu

hinzu %Vor%

weil es nicht als Array initialisiert ist.

Wenn Sie schreiben würden:

%Vor%

Dann würde es funktionieren.

Mit:

%Vor%

Sie initialisieren implizit $test['a'] und $test['b'] als Array. Aber $test['a']['b'] (und so weiter) als int

    
Yoshi 11.05.2011 09:58
quelle

Tags und Links