Just nu i M3-nätverket
Gå till innehåll

metod för itteration över t ex ett databasresultat


/randis

Rekommendera Poster

Hej!

 

Jag har länge funderat över hur man ska göra en objektorienterad lösning för alla de där metoderna som får namnet List****. Till exempel ListPaymentMethods i klassen Order.

 

Så jag vill kunna göra något i stil med:

$O = new order;
while($PM = $O->ListPaymentMethods()) {
echo $PM->GetName();
}

Problemet är att hur jag än gör så kommer orderklassen behöva en hållare för databasresultatet.

 

Något i stil med:

class Order {

private $holder = false;

public function ListPaymentMethods() {
if(!$this->holder) {
$this->holder = mysql_query('SELECT whatever FROM whoever');
}
if($row = mysql_fetch_array($this->holder)) {
//Låt oss låtsas att konstruktorn för PaymentMethod accepterar en rad från databasen som argument.
return new PaymentMethod($row);
}
return false;
}

}

 

Det funkar ju helt okej. Men jag gillar inte att den kräver en property som stökar i min klass. En del objekt har ett större antal "List"-funktioner. Finns det bättre sätt att göra det på? Tittade lite på PBL och alla itterationer där, men hittade inget som hjälpte mig. Hur jag än vänder på det blir jag inte av med hållaren. Det skulle ju vara att stoppa den i någon statisk iterationsklass, men då är den ju inte inkapslad längre.

 

[inlägget ändrat 2008-09-07 22:30:54 av /randis]

Länk till kommentar
Dela på andra webbplatser

mjo... Allt beror väl på hur objektorienterat man vill ha det antar jag. Men låt säga att jag listar betalmetoderna ett antal gånger på olika sätt på olika ställen så är inte en statisk klass som skriver drop downs särskilt bra. Jag kanske vill manipulera min betalmetodsklass till och med? Givetvis hade det kunnat gå att lösa så, men om tanken är att vara minnessnål så skulle jag inte ha en OOP approach på något över huvudtaget. Men vi kan väl ta ett annat exempel så det blir tydligare.

 

Vi har ordern med dess varor. Där vill man kunna manipulera varorna. Ta bort, lägga till fler, ändra antal och priser osv. Så funktionen skulle bli "ListItems". Att jag kör in alla värden som en array beror på att jag inte vill använda en databasfråga för varje item.

Låt säga att jag i ListItem hade en query som såg ut såhär: "SELECT id FROM orderItem WHERE orderId = 1202" och sedan anropar jag objektet med $OI = new orderItem($id) varpå konstruktorn i orderItem får göra en ny query för att hämta alla data.

 

Men eftersom inget av de exempel jag listat är speciellt verkliga utan frågan gällde hur man löser problemet som jag listat i första posten så betackar jag mig för hur mina metoder och koden kan göras resurssnålare.

 

Länk till kommentar
Dela på andra webbplatser

Ja det är väl en fråga om tolkning. Man skulle ju kunna ha bara klassen site också.

 

En statisk DbEngine skulle ju isf begränsa oss till högst en pågående itteration? Såvida de inte läggs i någon array eller så då. Eller har jag fel?

 

Du har ju fortfarande hakat upp dig på hur du tycker att min orderklass ska se ut och inte svarat på min fråga som behandlar en metod för itteration över ett databassvar i en klass.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...