The horrors of PHP

Wenn herauskommt, dass ich tatsächlich noch PHP bei manchen Kunden einsetze, bin ich vermutlich bald arbeitslos. Aber ich kann alles erklären!!! Das hat.. historische Gründe. Und für manche Zwecke ist das Framework tatsächlich ziemlich brauchbar, vor allem aus dem Preis-Leistungswinkel heraus betrachtet.

Heute ein kleines Schmankerl, das mich einen halben Tag gekostet hat und mit einem Schlag gegen die Stirn endete, den ich heute noch spüre. Ausgangssituation ist die Befüllung eines Array mit weiteren Strukturen (auch assoziative Arrays). Dabei werden manchmal neue Einträge erzeugt, während in anderen Fällen ein bereits bestehender Eintrag ergänzt wird.

Consider this code:

$main = array();

$first = array(); // erster Eintrag
$first["bla"] = "blup";

$main[] = $first;

// wenn man diesen Eintrag noch ändern will
$change_it = end($main);
$change_it["bla"] = "blip";

// schaun wir mal
print_r($main);

Huch, immer noch "blup"! Ist klar, end() liefert nur eine Kopie. Man muss sich also eine Referenz holen. Dies gelingt mit dieser ziemlich "eingängigen" (höhö) Syntax:

end($main);
$change_it = &$main[key($main)];
$change_it["bla"] = "blip";

Jetzt ist es fein, in "$main" ist des nun korrekt mit "blip" überschrieben. Doch damit nicht genug. Jetzt kommen wir zum eigentlichen Spezialisteneinsatz.

// Ein weiteres Element hinzufügen
$change_it = array();
$change_it["bla"] = "blop";
$main[] = $change_it;
// schaun wir jetzt mal
print_r($main);

Ach du Sch****! Was ist denn hier passiert?


Array
(
    [0] => Array
        (
            [bla] => blop
        )

    [1] => Array
        (
            [bla] => blop
        )
)

Meine Erwartungshaltung wäre gewesen, dass durch die Zuweisung der Neuanlage des Arrays der Referenz-Bezug aufgehoben ist. Aber das ist nicht der Fall! Füge ich folgendes ein:

unset($change_it);

funktioniert es wie erwartet:

Array
(
    [0] => Array
        (
            [bla] => blip
        )

    [1] => Array
        (
            [bla] => blop
        )
)

Man darf also nie vergessen, dass die Normalität nur ein dünner Schleier vor der Anarchie und dem Chaos ist.. ne quatsch, ich meine natürlich PHP nur ein Wrapper über eine C-Libary ist, deren haarige Knochen immer mal wieder hier und dort herausgucken. Musch halt wissa! Meine Güte.

Leave a Reply