Avatar billede fangel Nybegynder
03. maj 2003 - 15:45 Der 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?

Morten
Avatar billede tangveje Nybegynder
03. maj 2003 - 15:57 #1
Du kan vel bruge et array, sådan her f.eks.

$isps['TDC']
$isps['Tiscali']
$isps['World_Online']

Så er det jo rimeligt nemt at loope gennem det array og finde alle instances. Kan ikke lige se hvordan det ellers kan gøres.
Avatar billede fangel Nybegynder
03. maj 2003 - 16:01 #2
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
  }
  ...
  ...
  ...
}
Avatar billede jakoba Nybegynder
03. maj 2003 - 16:04 #3
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;

hvormange 'Instanser' har du nu ?
Avatar billede tangveje Nybegynder
03. maj 2003 - 16:08 #4
Jakoba > 2, eller tager jeg fejl? $ins3 = $ins1; laver vel bare en reference til $ins1 og ikke en ny instans
Avatar billede fangel Nybegynder
03. maj 2003 - 16:23 #5
jakoba => OK, måske ikke helt skudsikker, men har du en bedre løsning?
Avatar billede jakoba Nybegynder
03. maj 2003 - 16:40 #6
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å.
Avatar billede jakoba Nybegynder
03. maj 2003 - 16:41 #7
Ups. det skulle have været:
    $inst_ISP[] = $this;
Avatar billede fangel Nybegynder
03. maj 2003 - 16:43 #8
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?

Morten
Avatar billede fangel Nybegynder
03. maj 2003 - 16:43 #9
ahh... man kan godt bare bruge $this... OK... vil lige lege lidt med det... ;)
Avatar billede jakoba Nybegynder
03. maj 2003 - 16:53 #10
$inst_ISP = array();

class ISP{

  var $mitnummer;

  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.

mvh JakobA
Avatar billede fangel Nybegynder
03. maj 2003 - 16:53 #11
jeg synes umidbart der er lidt problemer med det... kan altså ikke helt få det til at gøre som jeg vil...

Morten
Avatar billede fangel Nybegynder
03. maj 2003 - 18:00 #12
den kan godt lidt, men den får ikke fat i de variabler som ikke er globals!

Morten
Avatar billede jakoba Nybegynder
03. maj 2003 - 18:10 #13
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.
  }
Avatar billede postndk Nybegynder
03. maj 2003 - 18:58 #14
jakoba >
hvad betyder det ; efter mitnummer ???
$this->mitnummer; = count($inst_ISP);
Avatar billede fangel Nybegynder
03. maj 2003 - 18:59 #15
OK, men hvad vil afhjælpe problemet med at

$inst_ISP[0]->funktion_i_klassen();

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 '')

Morten
Avatar billede jakoba Nybegynder
03. maj 2003 - 19:28 #16
postnk >> det betyder jeg er en sjuske. det ';' skal definitivet ikke være der :(
Avatar billede postndk Nybegynder
03. maj 2003 - 20:12 #17
okay, det er jeg glad for, har selv arb. en del med classer og havde aldrig stødt på det .. ;o) ...
Avatar billede jakoba Nybegynder
03. maj 2003 - 20:16 #18
postndk >> kunne ud så ikke også tage og rette resterende fejl ? (dine points)
Avatar billede fangel Nybegynder
10. juni 2003 - 21:56 #19
nå, jeg fik det aldrig til at virke helt... jeg har også droppet måden, da den var lang og uoverskuelig...

nogle der vil have point?

Morten
Avatar billede fangel Nybegynder
12. juli 2003 - 11:17 #20
vi må håbe det bliver nemmere i PHP5...

jeg lukker her!

Morten
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester