WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hålla reda på classer (https://www.wn.se/forum/showthread.php?t=5188)

Tvartom 2004-12-27 02:15

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");
        }
}

?>

Ger följande outout:
Citat:

Karl
Per
Lars

$pelle har med andra ord inte bytt namn i referensen!

Hur löser man detta, eller ett annat bra sätt att lista vilka instansen som finns av en viss class?

grazzy 2004-12-27 14:48

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

Tvartom 2004-12-28 20:36

Citat:

Originally posted by grazzy@Dec 27 2004, 14:48
Jag tror att du tänker åt fel håll lite.
Börjar förstå det lite...

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;
}
}
?>

Men jag tycket det verkar vara ganska mysko kod så jag använder inte det
och har skrivet om och gjort på ett helt annat sätt istället.

Tack för hjälpen!

Charlie 2004-12-29 05:16

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 ;) ) är det kanske ett enligt dem sk. "factory" som du är ute efter.

De har även information om "singleton", "autoloader" etc. väldigt praktiska och hjälpsamma funktioner :) Jag har dock tyvärr ej länkarna i huvudet. Besök Zend -> Webmaster något -> Information om OOP med PHP5 :)

Även om du redan har löst det här problemet är det nog väldigt givande.

magentos 2005-01-03 22:36

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


Alla tider är GMT +2. Klockan är nu 17:43.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson