03. maj 2003 - 15:45Der er
19 kommentarer og 1 løsning
Finde alle instances af en klasse
Hej
lad os sige at vi har en klasse der hedder fx "ISP", og vi har 3 instances af den "$TDC", "$Tiscali" og "$World_Online", hvordan finder jeg så disse instances af klassen uden at kende navne på dem?
Efter ti år i London, Madrid, Paris og Utrecht kommer Sabios AI-fokuserede program af arrangementer om kundeoplevelser, ‘Disrupt’, for første gang til Danmark.
det var også sådan jeg tænkte på at lave det, men tænkte der måtte være en anden vej... ;)
en måde at lave dit foreslag på var fx at scriptet selv lavede en ny række i arrayet når der blev oprettet en ny instance af klassen... men kan man se, når klassen bliver oprettet, se hvilket navn den får?
hvis man kunne det, så ville jeg lave det sådan her
var $isps; global $isps;
class ISP{ function ISP(){ // constructer til klassen $isps[] = "???"; // her skal der så stå det som klassen bliver kaldt // fx, hvis du laver en $TDC = new ISP(); skal den indeholde TDC } ... ... ... }
pas på med at forveksle variabelen $TDC med 'en instans af klassen'. Det er ikke det samme. fx: $ins1 = new DinKlasse(); $ins2 = new DinKlasse(); $ins3 = $ins1; $ind4 = $ins3;
Det sikreste er mok at lade konstructorfunktione oprette navnet. På den måde er vi sikre på at hver instans kun får eet navn $inst_ISP = array();
class ISP{ function ISP(){ // constructer til klassen global $inst_ISP; $inst_ISP[] = "isp"´+count($inst_ISP); // her skal der så stå det som klassen bliver kaldt // fx, hvis du laver en $TDC = new ISP(); skal den indeholde TDC } ... ... ... }
egentlig er der vel ingen grund til at lave et navn. blot de alle står i det $inst_ISP array.
næste problem kommer så hvis du laver instanser der skal nedlægges igen. der må du sørge for at fjerne i arrayet også.
der bliver ingen der skal nedlægges igen... men hvordan er det lige du vil få fat i navnet, og ikke bare antallet af instances? kan ikke umidbart kan jeg ikke se at den vil lægge dens navn et sted?
function ISP(){ // constructer til klassen $this->mitnummer; = count($inst_ISP); // identificerer DENNE instans global $inst_ISP; $inst_ISP[$this->mitnummer] = $this; }
function finalize_ISP() { deconstructor til klassen $inst_ISP[$this->mitnummer] = null; } ... ... ... }
Jeg må nok bede Dea_pg om at fixe syntax og brud på scope-regler. Jeg har aldrig selv brugt php's objekter så der er sikkert masser af fejl. Men ideen skulle være nogenlunde klar håber jeg.
Ups der er også en logisk fejl. hvis jeg sætter elementer til null bliver næst count($inst_ISP) da vist forkert.
function ISP(){ // constructer til klassen $this->mitnummer; = count($inst_ISP); // identificerer DENNE instans global $inst_ISP; $inst_ISP[$this->mitnummer] = $this; }
function finalize_ISP() { deconstructor til klassen global $inst_ISP; $inst_ISP[$this->mitnummer] = 0; // nu er det stadig en værdi, blot ikke et objekt. }
virker fint, bort set fra den ikke kan få fat på variabler inde i klassen med mindre disse er globale? (og derfor returnere et array hvor alle værdier er '')
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.