Door
Roeltje M
op 29-07-2013 18:47
gewijzigd op 29-07-2013 19:22
4.976 views
Hey Allemaal!
Ik zit al een poos in de PHP wereld, maar wat minder lang in de OOP wereld. Ik heb hier een aantal keer mee gewerkt, maar ga nu eens zelfstandig iets opbouwen met OOP: een webshop!
Op dit moment heb ik een opzetje gemaakt m.b.t. de eigenschappen en objecten die ik hiervoor ga gebruiken, waartna ik deze vertaal naar OOP.
Graag zou ik hierop op/aanmerkingen willen ontvangen ter lering voor mijzelf en om een goed startpunt te hebben om verder uit te bouwen!
Daarnaast heb ik nog een vraag over het 'getten' van informatie vanuit database: Stel, je wilt je NAW gegevens getten. Doe je dit dan dmv een array (waarin je adresgegevens etc zet), of doe je dat per element apart (straatnaam, straatnummer, toevoeging ed...)
Je objectmodel is al redelijk goed voor een complete webshop, maar leunt nog iets te veel op een databasestructuur: wat je "objecten" hebt genoemd, zouden databasetabellen kunnen zijn en de "eigenschappen" per object lijken vervolgens op databasevelden.
In het objectmodel mis je misschien daarom ook minstens twee klassen: een voor de database en een voor de webpagina's (of ruimer: views). Dat beantwoordt misschien ook je vraag over het "getten" van data uit de database. Dat implementeer je namelijk niet apart in elk object (voor klant, adres, order, enzovoort), maar handel je centraal af via een databaseklasse.
Met deze basisopzet kun je wel gewoon een eerste concept gaan bouwen; je merkt dan vanzelf waar je extra objecten en klassen nodig hebt.
Ik bedoel niet $_GET Chris, bedoel eigenlijk get(). Maar het ophalen van de database gegevens dus.
Ik ga een opzetje maken! Ik merk wel dat ik moeite heb met de vertaling naar code.
Ik moet een class maken voor de database, waarin ik functies als uitvoeren van queries, connecten met database e.d. doe.?
Daarnaast moet ik classes hebben voor Cart, Customer e.d.?
En dan elke x als ik gegevens ophaal uit de database, de query-functie aanroepen vanuit database class (Database::query("SELECT ... FROM ...");?
Als je nu toch met een database class begint, doe het dan nu goed en ga nu al geen mysql functies er meer in gebruiken. Die functies gaan eruit, dus gebruik ofwel mysqli, ofwel PDO.
Gebruik geen publieke properties, gebruik alleen private properties. Met publieke of protected properties krijg je afhankelijkheden in je code die je later problemen gaan geven als je eens iets wilt veranderen.
Een Customer class zou niet de connectie met de database moeten verzorgen. Als je het zo doet moet je elke class die de database nodig heeft de connectie gegevens geven, dat wil je niet. Maak een aparte connectie (configuratie) class die de connectie gegevens beheert. Dan hoef je alleen die class aan te passen als je eens de applicatie op een andere server installeert.
Overigens denk ik dat uberhaupt de customer class niet direct een database class moet aanroepen. Wat als je morgen eens een andere datasource gaat gebruiken? Dan moet je die Customer class gaan herschrijven, ook dat wil je niet.
Dit kan niet:
<?php
Mysql_Database::connect
?>
de methode connect in de database class is niet als static gedefinieerd, dus je kan het niet zo aanroepen. Overigens kan je ook beter niet met static methodes werken, dat heeft weinig voordelen en veel nadelen.
Alles kort samengevat zou ik als ik jou was even terug naar de basis gaan. In een echte OOP omgeving heeft elke class maar 1 doel. Elke class dient om 1 functionaliteit uit te voeren. Denk daarover na elke keer dat je een class ontwerpt. Als een class meer dan 1 doelen dient dan moet je je afvragen of je die class niet beter kan splitsen.