Hi,
ich verstehe auch nicht, wieso nach Syntax ein guter Ansatz sein soll, wenn ein Benutzer im Endeffekt von der Datenbank-Klasse ableitet. So eine Vererbungshierarchie ist imho total schwachsinnig.
Eine "hat-ein"-Beziehung zwischen User und DB ist definitiv sinnvoller als eine "ist-ein"-Beziehung - denn der Benutzer ist keine Datenbank ... (Oder irgendwie so argumentiert). Zudem würde Syntax's Lösungsansatz das Problem, dass alle Objekte das gleiche DB-Objekt nutzen sollen, nicht (... denn mit seinem Ansatz ist fast jedes Objekt ein eigenes DB-Objekt).
1. DB als Singleton: Du kannst auf das DB-Objekt von überall zugreifen. Nachteil: Viele Klassen sind fest an das Datenbank-Objekt gebunden. Es ist nicht mögliche, einzelne Komponente ohne eine richtige Datenbank zu testen.
2. DI: Du übergibst das DB-Objekt an jedes Objekt (via Setter oder direkt dem Konstruktor). Wenn du für die DB-Klasse eine Schnitstelle definierst kannst du sie so austauschen.
Dazu kannst du noch einen DI Container nutzen: Das ist ein Framework, das für dich Objekte anlegt und dabei die Abhängigkeiten dieser prüft und auflöst. Ich weiß nicht, welche Frameworks es dafür in PHP gibt, aber in Java mit Guice könnte das beispielsweise so aussehen (Methodennamen können falsch sein, ich habe die nicht im Kopf):
Quote:
class MyService implements MyServiceInterface {}
class MyComponent {
@Inject private MyServiceInterface theService;
}
Injector guice = new Injector();
guice.bind(MyService.class).to(MyServiceInterface. class);
MyComponent c = guice.newInstance(MyComponent.class);
|
Guice erkennt die @Inject-Annotation automatisch und löst die Abhängigkeit auf; mit zusätzlichen Annotation kann bestimmt werden, dass von einem Service immer das gleiche Objekt genutzt werden soll.
Viele DI Container lagern die Informationen über die Abhängigkeiten auch in Konfigurationsdateien aus (z.B. Spring).
3. Service Locator Pattern: Jede Klasse kennt irgendwie einen Service Locator, der Abhängigkeiten auflösen kann. Quasi eine API wie
Quote:
|
DatabaseInterface db = locator.get(DatabaseInterface.class);
|
Der konkrete Komponent muss so nicht wissen, woher dieses Objekt stammt. Das PHP Framework "APF" löst das auch in etwa so - dort verfügt jeder Service (und Controller etc.) über eine Methode "getServiceObject(name:Str)", die eine Instanz des Services liefert.
Am besten zu schaust dir an, wie richtige Frameworks das lösen (Yii, Symfony etc.).