FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Hej!
Jag håller på att skriva en class och vill ha en funktion utanför classen som kan lista innehålla från samtliga definierade instanser av classen. Följande lösning fungarar inte, då endast saker som ändras i construktorn kommer med i $allapersoner Kod:
<?PHP $kalle = new person("Karl"); $pelle = new person("Per"); $lasse = new person("Lars"); $pelle->bytnamn("Peter"); skrivutallapersoner(); exit; class person { var $namn; function person ($nyttnamn) { global $allapersoner; $allapersoner[] = &$this; $this->bytnamn($nyttnamn); } function bytnamn ($nyttnamn) { $this->namn = $nyttnamn; } } function skrivutallapersoner() { global $allapersoner; foreach ($allapersoner as $tmpperson) { echo($tmpperson->namn."<br />\n"); } } ?> Citat:
Hur löser man detta, eller ett annat bra sätt att lista vilka instansen som finns av en viss class? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Jag tror att du tänker åt fel håll lite. Det är inte meningen att du skall försöka låta en klass hålla reda på dess instanser. Gör istället då en wrapper-klass som har en array med _referenser_ till objekten som du skapar, tex:
class PersonWrapper { // en ny wrapper-klass var $personer = new Array(); function PersonWrapper($nyttnamn) { // konstruktor instansiera array, lägg till referens till ny Person } class Person { // din gamla klass .... } } Eller, så har du helt enkelt en array som du definerar i ditt program och manuellt lägger till i? Du kan ju eventuellt skicka med en referens till arrayen till klassen och låta den där lägga till (dålig lösning dock). |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
Citat:
Jag hittade en lösning som funkar, Kod:
<?PHP function person ($nyttnamn) { global $allapersoner; $allapersoner[] = &$this; // Ett tilläg av följande rad gör att man kan nå $allapersoner[x]->namn senare med rätt värde: $this->namn = &$this->namn; $this->bytnamn($nyttnamn); } function bytnamn ($nyttnamn) { $this->namn = $nyttnamn; } } ?> och har skrivet om och gjort på ett helt annat sätt istället. Tack för hjälpen! |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Om det kan vara till någon hjälp besökte jag för ett tag sedan Zends websida, där de har publicerat diverse information om PHP5 och dess nya funktioner, där OOP då är belyst. Där har de på en sida en hel del smarta lösningar som man kan använda. Om jag inte missminner mig (vilket är mycket möjligt just nu 05:13
![]() De har även information om "singleton", "autoloader" etc. väldigt praktiska och hjälpsamma funktioner ![]() ![]() Även om du redan har löst det här problemet är det nog väldigt givande. |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Nykomling
|
om man är nyfiken på detta problem kan man läsa i php manualen
om referenser i konstruktorn. http://www.php.net/manual/sv/language.oop.newref.php |
|||
![]() |
![]() |
Svara |
|
|