PHP5 - Objekte werden nur per Referenz übergeben
Verfasst: So 18. Jun 2006, 23:38
Mag vielen klar sein, mich hat es Kopfzerbrechen gekostet:
Keine gute Idee:
Wozu man sowas braucht? Nun, man konnte es sich leicht machen: Wenn man z.B. für unterschiedliche Aufgaben jeweils über eine Select-Box (die der cHTMLSelectElement-Klasse entstammt) aus einem Baum eine idcat auswählen musste, konnte man das Objekt einmal erzeugen, mit ->updateAttributes (array("name" = "neuerName")) umtaufen und mit ->setDefault einstellen - ein Abfrage, einmal gefüllt, zwei Select-Boxen...
Mit PHP5 geht das nicht mehr: $oSelObject, $oSelObjectA und $oSelObjectB sind eins.
Mögliche Lösung:
Aber natürlich gibt es clone nur ab PHP5 (hey, es gibt ein clone aus dem PEAR-compat-Paket... toll). Und selbst in PHP5 isses nicht so der Burner, da clone keine 100%ige Kopie ergibt - Referenzen, die im Objekt verwendet werden, bleiben Referenzen - yeah!
Stellen wir uns also dumm und lassen PHP arbeiten:
Der coole Effekt ist, das zwar jetzt zwei korrekt benannte Select-Boxen ausgegeben werden - die aber immer auf dem gleichen Wert stehen, nämlich auf "EineAndereID" - der ID für Objekt B.
Ist natürlich auch logisch... $oOption enthält nur eine Referenz, auf ein Option-Element, da ja $oOption = new cHTMLOptionElement ($Beschriftung, $id);
Und das hat zur Folge, dass die setDefault-Methode durch die gleiche Parameter-Liste wandert und das gleiche Element auswählt; für beide Boxen...
Wer sich also wundert, so würde es dann gehen:
Für die Kenner vermutlich ein Achselzucken, für die anderen: zur Info 
Gruß
HerrB
Keine gute Idee:
Code: Alles auswählen
$oSelObject = cHTMLSelectElement("foo");
...
$oSelObject irgendwie füllen, z.B. mit ->autofill
...
$oSelObjectA = $oSelObject;
$oSelObjectA->machwasmitdemObjekt;
$oSelObjectB = $oSelObject;
$oSelObjectB->machwasanderesmitdemObjekt;
Mit PHP5 geht das nicht mehr: $oSelObject, $oSelObjectA und $oSelObjectB sind eins.
Mögliche Lösung:
Code: Alles auswählen
$oSelObjectA = clone $oSelObject;
$oSelObjectB = clone $oSelObject;
Stellen wir uns also dumm und lassen PHP arbeiten:
Code: Alles auswählen
$oSelObjectA = new cHTMLSelectElement("selObjectA");
$oSelObjectB = new cHTMLSelectElement("selObjectB");
...
Das jeweilige $oSelObjectX füllen und zwar mit:
$oOption = new cHTMLOptionElement($Beschriftung, $id);
$oSelObjectA->addOptionElement($id, $oOption);
$oSelObjectB->addOptionElement($id, $oOption);
...
$oSelObjectA->setDefault("EineID");
$oSelObjectB->setDefault("EineAndereID");
Ist natürlich auch logisch... $oOption enthält nur eine Referenz, auf ein Option-Element, da ja $oOption = new cHTMLOptionElement ($Beschriftung, $id);
Und das hat zur Folge, dass die setDefault-Methode durch die gleiche Parameter-Liste wandert und das gleiche Element auswählt; für beide Boxen...
Wer sich also wundert, so würde es dann gehen:
Code: Alles auswählen
$oSelObjectA = new cHTMLSelectElement("selObjectA");
$oSelObjectB = new cHTMLSelectElement("selObjectB");
...
Das jeweilige $oSelObjectX füllen und zwar mit:
$oOptionA = new cHTMLOptionElement($Beschriftung, $id);
$oOptionB = new cHTMLOptionElement($Beschriftung, $id);
$oSelObjectA->addOptionElement($id, $oOptionA);
$oSelObjectB->addOptionElement($id, $oOptionB);
...
$oSelObjectA->setDefault("EineID");
$oSelObjectB->setDefault("EineAndereID");

Gruß
HerrB