07. januar 2004 - 10:43Der er
6 kommentarer og 1 løsning
Arrays med referencer til værdier/objekter
Jeg sidder og arbejder med arrays, hvor elementerne er referencer til objekter. Men metoden til at indsætte dem på er lidt mærkværdig. Derfor har jeg lavet følgende lille test, som jeg gerne vil have et par kommentarer på.
Se på følgende kode: ------------------------------ $arr = array(); $k = 5;
$arr[] = &$k; echo $arr[0] // giver 5
$k = 6; echo $arr[0] // giver 6 ------------------------------
Hvad jeg i virkeligheden GERNE vil have er, at $k kunne "genbruges" uden at det påvirker $arr[0]. Det kunne jeg selvfølgelig gøre ved bare at sige $arr[] = $k, for så vil $arr[0] indeholde en kopi.
MEN eksemplet er også kun hypotetisk. Forestil istedet, at $k var en instans af en klasse:
$k = new MyClass(...)
Denne instans indeholder selv andre refererede objekter, og har derfor ikke godt af at blive kopieret.
Så mit ønske er at kunne "deponere" instansen i array'et, og bruge $k til at oprette en ny instans, som så også skal gemmes i array'et osv.
Jeg kan gøre det således: -------------------------- function array_add(&$a, &$item) { $a[] = $item; }
$arr = array(); $k = 5;
array_add($arr, $k); echo $arr[0] // giver 5
$k = 6; echo $arr[0] // giver stadig 5 --------------------------
Dvs. jeg bruger en hjememstrikket funktion til formålet, som tager elementet som en reference.
Findes der en mere elegang PHP konstruktion til formålet?
Jeg ved at spørgsmålet bliver underordnet, når PHP 5 engang er færdig. For i PHP5/Zend2 oprettes alle objekter automatisk som referencer. Men jeg har problemet lige nu. :-)
"nårsomhelst to assigner et Objekt til en variabel er det i virkeligheden en reference til det objekt der bliver assignet."
um... nej det er ikke korrekt. Tag dette eksempel:
$a = new MinKlasse(); $b = $a;
$a og $b indeholder nu to FORSKELLIGE instanser af MinKlasse. Og det er netop fordi at denne assignment laver en kopi af $a's instans. Din tese er korrekt fra PHP version 5.0 (pga. den nye Zend 2.0).
Det er MULIGT, at $a kun indeholder en reference til objektet (instansen), men hvis man assigner den til $b, så kopieres objektet til et nyt.
Ok, sidste formulering - og en løsning på mit oprindelige problem, som PLUDSELIG dumpede ned i hovedet på mig :)
Mit sidste ovenstående eksempel løses ved at sige:
$b = &$a;
Så peger $b og $a på samme objekt. Mit oprindelige problem var så, at jeg ønskede at "deponere" objektet i $b, og så bagefter bruge variablen $a til et helt andet formål. Sagt på en anden måde i et eksempel:
$lager = array();
for ($i=0; $i<10; $i++) { $temp = new MinKlasse($i); $temp->gørnogetmere(); $lager[] = &$temp }
Ovenstående virker ikke, fordi der sker følgende:
1) $temp assignes objektet MinKlasse(0) 2) $lager[0] assignes samme objekt MinKlasse(0) 3) næste loop 4) $temp assignes objektet MinKlasse(1) - SAMTIDIG assignes $lager[0] MinKlasse(1) 5) $lager[1] assignes objektet MinKlasse(1)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.