/randis Posted September 7, 2008 Share Posted September 7, 2008 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 More sharing options...
Phenomen Posted September 8, 2008 Share Posted September 8, 2008 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 More sharing options...
/randis Posted September 8, 2008 Author Share Posted September 8, 2008 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 More sharing options...
Phenomen Posted September 8, 2008 Share Posted September 8, 2008 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 More sharing options...
Phenomen Posted September 8, 2008 Share Posted September 8, 2008 php iteration http://www.daaq.net/old/php/index.php?page=php+iteration&parent=php+flow+control&printme=true Sen har de glömt foreach Link to comment Share on other sites More sharing options...
/randis Posted September 11, 2008 Author Share Posted September 11, 2008 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 More sharing options...
Phenomen Posted September 11, 2008 Share Posted September 11, 2008 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.