Ich speichere Child-Objekte mit Daten in einem Array eines Parent-Objektes.
Soweit alles kein Problem, ich kann dieses Array an eine Funktion übergeben und dieses Array wird dann auch als Kopie erhalten, so das Änderungen nur in der Funktion aber NICHT im Parent Gültigkeit haben.
Wenn ich aber auch nur einmal eine Methode eines Child's vom Parent aus Aufrufe, ändert sich scheinbar der Inhalt des Array im Parent.
Weiter Übergaben an Funktionen haben nun zur Folge das sich die Änderungen AUCH auf das Child-Objekt im Parent beziehen.
Was da nun wirklich passiert kann ich nicht besser beschreiben....
Beispielcode:
-------------------------------------------------------------------
----------------------------------------------------------------------------
Das Ausgabe-Ergebniss ist Wundersammerweise:
1.: child 0 is ok / child 1 is ok
2.: child 0 is ok / child 1 is ok
3.: warum geändert? / child 1 is ok
Wer kann mir das erklären?
Ach ja, verwendet wird hierbei php 4.3.x (PHP 5 leider nicht z.Z möglich)
Vielen Dank sagt schon mal der Markus
Soweit alles kein Problem, ich kann dieses Array an eine Funktion übergeben und dieses Array wird dann auch als Kopie erhalten, so das Änderungen nur in der Funktion aber NICHT im Parent Gültigkeit haben.
Wenn ich aber auch nur einmal eine Methode eines Child's vom Parent aus Aufrufe, ändert sich scheinbar der Inhalt des Array im Parent.
Weiter Übergaben an Funktionen haben nun zur Folge das sich die Änderungen AUCH auf das Child-Objekt im Parent beziehen.
Was da nun wirklich passiert kann ich nicht besser beschreiben....
Beispielcode:
-------------------------------------------------------------------
Code:
//Data-Objekt der Child's class child_o { var $child_data; function child_o($child_data) { $this->child_data=$child_data; } //der Name sagt alles function nur_mal_eine_child_funktion_zum_aufrufen() { } } //Parent-Objekt class parent_o { var $child_array; function parent_o() { //2 childs als Objekte im Array erstellen und Text zuweisen $this->child_array = array(); $this->child_array[0] = new child_o("Data child 0 is ok"); $this->child_array[1] = new child_o("Data child 1 is ok"); } function fehler_verursachen() { //NUR im ersten Objekt eine Funktion aufrufen (eine Funktion ohne Inhalt reicht schon...) $this->child_array[0]->nur_mal_eine_child_funktion_zum_aufrufen(); //und von nun an enthält child_array[0] scheinbar eine Referenz und ist bei normalen nicht referenzierten Funktions-Übergaben änderbar.... } function test_funktion_des_ueberschreiben() { //eine exteren Funktion aufrufen, diese sollte eigentlich NICHT in der Lage sein Child-Daten dieses Objektes zu ändern (keine Referenzübergabe)! externe_function_sollte_daten_nicht_aendern_da_keine_referenz_uebergabe($this->child_array); } } function externe_function_sollte_daten_nicht_aendern_da_keine_referenz_uebergabe($object_child_array) { //Child-Daten ändern, sollten eigentlich nur in dieser Funktion gültigkeit haben (da keine Referenz) foreach ($object_child_array as $key => $value) { $object_child_array[$key]->child_data = "warum geändert?"; } } //Parent erzeugen $parent = new parent_o(); //erste Ausgabe, sollte OK sein echo "1.: ".$parent->child_array[0]->child_data." / ".$parent->child_array[1]->child_data." "; //erster Versuch die Daten zu ändern (geht aber noch nicht, was auch so sein sollte) $parent->test_funktion_des_ueberschreiben(); // Zweite Ausgabe, sollte auch noch OK sein. echo "2.: ".$parent->child_array[0]->child_data." / ".$parent->child_array[1]->child_data." "; //dieser Aufruf verursacht das Problem, denn durch den einfachen Aufruf einer Funktion in Child[0] sind nun die betroffenen Daten des Child[0] wie bei Referenzen änderbar $parent->fehler_verursachen(); //zweiter Versuch die Daten zu ändern, nun werden die Daten des Child[0] geändert - warum auch immer..... $parent->test_funktion_des_ueberschreiben(); // Dritte Ausgabe, nun seht Ihr das Problem echo "3.: ".$parent->child_array[0]->child_data." / ".$parent->child_array[1]->child_data." ";
Das Ausgabe-Ergebniss ist Wundersammerweise:
1.: child 0 is ok / child 1 is ok
2.: child 0 is ok / child 1 is ok
3.: warum geändert? / child 1 is ok
Wer kann mir das erklären?
Ach ja, verwendet wird hierbei php 4.3.x (PHP 5 leider nicht z.Z möglich)
Vielen Dank sagt schon mal der Markus
Kommentar