Just nu i M3-nätverket
Jump to content

metod för itteration över t ex ett databasresultat


/randis

Recommended Posts

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]

Link to comment
Share on other sites

Varför hämta data från databasen & sedan spara det i minnet för att sedan skriva ut det?

 

Räcker med en static function-metod som printar dina paymentmethods. Du kan lätt göra olika varianter av denna func. En som printar DropDownListItems, en annan RadioButtonListItems etc.

 

I sessionen har du säkert en Cart-klass. Den behöver bara hålla redan på Paymentmethod-id

 

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

Man kan vara objektorienterad och ha endast klasserna

 

User

CartItem

Cart

 

och en klass som jag valt å kalla DbEngine som har static-metoder & som fungerar som länk mellan klasserna ovan och databasen.

 

 

 

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

Jag påstår inte att du inte kan nåt eller att du är dum när du läser in klasser från databasen och sparar det i sessionen. Ta det bara som en synpunkt och tänk på att du INTE har tillgång till hela serverns OS.

 

Du jobbar med php, ett språk som egentligen är ett html-hack-scriptspråk. Att spara ett tiotal klasser i sessionen och samtidigt ha 1000-tals användare leder förr eller senare till att du blir kontaktad av webhotellet som klagar på att din webapp belastar servern.

 

 

Har man de nödvändigaste klasserna i sessionen och en klass av static-metoder som vid behov kan anropas funkar mycket bättre tycker jag.

 

DBEngine->RegisterOrder( $_SESSION[´UserCart'])

 

 

Men det är som sagt min syn på saken.

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...