Sowieso vindt ik de benaming (semantiek, ik weet) 'database class' al fout per definitie - het is geen class dat een database is, maar een class die verbindingen en communicatie met een database beheert. Met andere woorden, ik zie liever praat over een DatabaseConnection class, een Query class, een QueryExecuter, etcetera.
PHP:
1
2
3
4
| $connection = new MySQLDatabaseConnection($config);
$query = new Query()->select('*')->from('mijntabel')->where('conditie = waarde')->and('andereconditie = anderewaarde');
$result = new QueryExecuter()->executeSelect($query, $connection);
$connection->close(); |
En wat betreft het hele singleton verhaal: singleton is een luie manier om niet aan dependency management te doen. Bij een singleton stop je iets in de global scope (wat niet slecht per sé is, maar toch niet optimaal), en wat belangrijker is, je voegt de verantwoordelijkheid van het krijgen van een verbinding toe aan alle objecten die een databaseverbinding nodig hebben. Hierdoor zul je bij grotere scripts (en scripts die door meerdere mensen gemaakt worden) het overzicht verliezen van waar overal de databaseverbinding gebruikt wordt.
Het is beter om dit centraal te houden, dwz één centrale plaats waar een databaseverbinding 'uitgedeeld' wordt aan de objecten die het gebruiken. MVC-actig:
PHP:
1
2
3
4
5
6
7
8
| $connection = new MSSQLDatabaseConnection($config);
// eventueel stukje code om te controleren of de PersonDao ook daadwerkelijk gebruikt moet worden
// hier heb ik nog geen leuke oplossing voor gevonden, maar ik ben ook meer gewend aan Java
$personDao = new PersonDao($connection);
$henkDao = new HenkDao($connection);
$personController = new PersonController($personDao, $henkDao);
// etc |
Zo weet je precies wie wanneer je databaseverbinding krijgt, waardoor je dit snel aan kunt passen. Je kunt ook makkelijk je HenkDao een andere verbinding geven (niet dat er veel PHP apps zijn die meerdere databases gebruiken, maar je weet maar nooit). En natuurlijk bespaar je weer de regels code in je classes die een verbinding moeten opzoeken, alsmede de verantwoordelijkheid daarvoor. En een regel van nette code is dat je classes zo weinig mogelijk verantwoordelijkheid hebben.
/rant