// OO
class DB {
private static $mysqli;
private function __construct(){} //no instantiation
static function cxn() {
if( !self::$mysqli ) {
self::$mysqli = new mysqli("localhost", MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);
}
return self::$mysqli;
}
}
// Deze is nu zo te gebruiken:
DB::cxn()->query($query);
In dit voorbeeld is de functie query() van mysqli zelf. Ik kwam gisteren tegen dat je dus zelf functienamen gewoon kan gebruiken als ze al bestaan (met enkele regels om je aan te houden, maar die even daargelaten)
Wat ik wil is mn eigen query() maken, maar als ik in de bovenstaande class dit toevoeg:
DB::cxn() geeft een MySQLi object terug en geen object van het type DB, dus als je daar een methode query aan toevoegt zal er niks gebeuren. Je zult dan MYSQLi moeten extenden:
De connection method cxn() die je gebruikt, werkt volgens het singleton patroon en geeft een instantie van de mysqli class terug. Je roept dus de method "query" aan van het mysqli object, en niet die van je database class.
class DB {
private static $mysqli;
private function __construct(){} //no instantiation
static function cxn() {
if( !self::$mysqli ) {
self::$mysqli = new mysqli("localhost", MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);
}
return self::$mysqli;
}
public static function query($query) {
if(!...) { // hier doe je dan bijvoorbeeld checks op je query, variabelen preparen, you name it.
throw new InvalidArgumentException("Query was not valid");
}
return self::$mysqli->query($query);
}
}
// dan kan je gewoon dit doen:
DB::query($query);
if(!...){// hier doe je dan bijvoorbeeld checks op je query, variabelen preparen, you name it.
throw new InvalidArgumentException("Query was not valid");
}
returnself::$mysqli->query($query);
}
}
// dan kan je gewoon dit doen:
DB::query($query);
(niet getest...)
Op die manier pas je dus een vorm van het adapter pattern toe. Je wikkelt je eigen klasse rond een mysqli object.
In dit geval wordt cxn() eigenlijk alleen maar intern gebruikt, dus je kan er voor kiezen om deze niet publiek beschikbaar te maken door deze method de private access modifier mee te geven.
Omdat ik tegenkwam dat ik de mysql functies moest vervangen door of mysqli of PDO. En ik heb de eerste aangeklikt
Edit: Ik snap geen reet van de termen die Koen gaf, maar even inlezen (ik snap dat ik query nu kan gebruiken zoals ik kon met cnx(), maar verder niet zoveel)
Edit2: Waarom PDO? Ik zit er nu even naar te kijken en ik zie alleen maar een andere manier van opschrijven. Wat is het voordeel/nadeel tov mysqli? PDO vs Mysqli - Which should you use
Singletons betekend dat je iets maar 1 keer aanmaakt en het daarna niet meer opnieuw kan aanmaken. Dat wil je niet in je applicatie, dan kun je niet testen en singletons zijn gewoon een anti-pattern.
Wat je veel beter kunt doen is bijv. Dependency Injection gebruiken.
Ook zou ik inderdaad het adapter pattern toepassen, zoals Koen al aangaf.
MySQLi is slechts een wrapper van MySQL, PDO is een hele nieuwe extensie. Waarom ik PDO zou gebruiken:
- MySQL kan alleen met een MySQL database werken, PDO kan met heel veel verschillende databases werken (bijv. sqlite, ect.). Allemaal hebben ze de zelfde interfaces, waardoor je makkelijk van database type kan switchen (bijv. sqlite voor testen en mysql voor productie)
- PDO heeft een beter prepared statement systeem
Nu plaats ik, helaas voor jullie, vaak grote uitleg en code voorbeelden op de site van jullie concurrentie. Maar toch ga ik hier wat nuttige linkjes neerzetten, omdat dit ook de manier is hoe ik OO heb geleerd: Datamapper pattern
- http://phphulp..../1/#606620
- http://phphulp....54/#580025
Nog wat andere tips:
- Leer veel over design patterns, daardoor test en leer je je oo gedachtengang. Een echte aanrader is het boek "Head First Design Patterns"
- Gebruik third-party libraries. In dit geval zou ik niet zelf een database klasse maken, maar bijv. gewoon Doctrine2 DBAL gebruiken. Gebruik Composer om deze third-party libraries makkelijk te kunnen beheren
Oke, bedankt voor de info allemaal. Ik merk dat het grote voordeel van PDO is dat het kan schakelen naar andere databasetypes, dit zie ik niet gebeuren in onze systemen, in ieder geval niet in een toekomst waar ik me nu al mee bezig moet gaan houden.
Op dit moment is mn class kennis erg laag en dusver 'lees' ik de mysqli structuur makkelijker waardoor ik sneller door kan (en tijd=geld ).
De kern van de sites waar ik aan werk is gebaseerd op register_globals = 1, dat moet ik ook deze ronde allemaal goed gaan zetten, dus ik heb al een berg werken en testen voor me.
Ik ga eerst langzaam inkomen in classes met mysqli op zn OO's, en wie weet schakel ik een keer over
Merk op dat classes niet OO is en dat het gebruik van MySQLi helemaal nog niks met OO te maken heeft.
Dat gezegd hebbende, waar OO wil omdraait is doormiddel van best practises en principes je code zo flexibel mogelijk te maken. Dat houdt onder andere in dat je met max. 10 regel te bewerken moet kunnen switchen van database, systeem gebruik, ect.
Om even in te haken op je tijd=geld aspect... Je kunt natuurlijk ook gebruik maken van een framework, bijvoorbeeld Symfony2.
Daarmee zorg je voor
1. Meer structuur in je code
2. Verminder je programmeerrisico's (doordat je het wiel niet opnieuw uit hoeft te vinden)
3. Sneller bouwen van de website
Ook ben je verzekerd van framework updates en een actieve community. Kortom, meer zekerheid.
In Symfony2 zit standaard Doctrine2, dat is een Object Relational Mapping (ORM) library/tool. Kort gezegd, kun je met Doctrine2 snel door middel van objecten in je code communiceren met de database.
Ik heb het ook gebruikt, op aanraden van WouterJ, het is goed bevallen en echt super handig. Sindsdien bouw ik al mijn PHP projecten met Symfony2.
Overigens, deze topic sluit volgens mij goed aan bij je vraag, daarom is het misschien waardevol om even te lezen.
WouterJ schreef:
...
Nu plaats ik, helaas voor jullie, vaak grote uitleg en code voorbeelden op de site van jullie concurrentie. Maar toch ga ik hier wat nuttige linkjes neerzetten, omdat dit ook de manier is hoe ik OO heb geleerd:
...
Haha, vet cool die UML diagrammetjes. Hoe heb je die gemaakt? Kan dat op Sima ook?
>> Haha, vet cool die UML diagrammetjes. Hoe heb je die gemaakt? Kan dat op Sima ook?
't is gewoon code, dus ja dat kan hier ook (al verpest een bug in de syntax highlighter het waarschijnlijk wel)
En hoe het gemaakt is? Gewoon in kladblok of je favoriete editor. Zelf heb ik het gemaakt in Vim, mijn editor, icm de block select feature (om de blocks naast elkaar te krijgen) en Tabular.vim (om snel alles goed uit te lijnen)
Again, bedankt allemaal. Ik begrijp de voordelen die worden opgenoemd, maar ook deze zijn slecht toepasbaar op het CMS waar ik mee werk. Het CMS is gemaakt door mn werkgever, en om het te omschrijven, die programmeert php4 en het is oud dus alles is producueel en oldSkool. De meeste scripts zijn niet geschikt voor aanpassingen op dit niveau, ik ben het langzaam aan het ombouwen (redelijk succesvol trouwens). Maar aangezien een klant maar betaald voor X tijd, moet ik daarin de site bouwen, en hier en daar beetje updaten, dus het is neit het snelste in de wereld
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.