Mehrfachvererbung von Klassen
Stefan Lodders
- php
Hallo!
Ich habe eine Klasse FileSystem, die für die Zugriffe auf das "normale" Dateisystem zuständig ist und eine Klasse MySQLDB, die die Zugriffe auf die MySQL-Datenbank regelt.
Nun möchte ich eine Klasse erstellen, die Eigenschaften von FileSystem UND MySQLDB erbt, da ich Daten aus einer Konfigurationsdatei auslesen möchte und die MySQL-Abfrage mit Hilfe der ausgelesenen Daten abfragen und grafisch aufbereiten will.
Nun unterstützt PHP aber meines Wissens keine Mehrfachvererbung.
Deshalb meine Frage: Gibt es ein halbwegs elegantes Workaround dafür ohne allzuviel Speicher mit unnötigen Klassen vollzuhauen?
Danke schonmal.
Stefan
Hi,
Nun unterstützt PHP aber meines Wissens keine Mehrfachvererbung.
Ja. Afaik weder Mehrfachvererbung noch eine Simulation dessen, wie mit Interfaces unter Java. Ich sehe deshalb zwei Moeglichkeiten. Die File Klasse ist entweder Kind Klasse deiner db Klasse (bzw. umgekehrt).
Oder du leitest ein Objekt deiner File Klasse ab und baust dann in der File Klasse wiederum ein Objekt deiner MySQL Klasse, um auf dessen Methoden zuzugreifen (wuerde ich favorisieren, da sauberer).
Deshalb meine Frage: Gibt es ein halbwegs elegantes Workaround
Obs elegant ist weiß ich nicht. Man merkt einfach, dass PHP nicht als objektorientierte Sprache konzipiert wurde. Aendern wird sich wohl vieles mit PHP5. Andererseits sind die OOP Möglichkeiten, die PHP schon jetzt fuer groessere (und auch kleinere) Projekte bietet, imho zigmal eleganter als jeder Spaghette Code ohne Klassen und Funktionen.
»»dafür ohne allzuviel Speicher mit unnötigen Klassen vollzuhauen?
Das verstehe ich nicht. Die Klassen brauchen ja erstmal gar keinen Speicher, sondern nur die Instanzen derselben :o)
Danke schonmal.
Stefan
Danke. Werde es mal versuchen.
»»dafür ohne allzuviel Speicher mit unnötigen Klassen vollzuhauen?
Das verstehe ich nicht. Die Klassen brauchen ja erstmal gar keinen Speicher, sondern nur die Instanzen derselben :o)
Na ja, meinte ich ja :). Will nicht irgendwelche Klassen mit instanzieren, wenn ich sie eigentlich gar nicht brauche. Bin in Sachen Speicher noch C64 geschädigt ;).
Seit PHP4.2.0 scheint Mehrfachvererbung übrigens möglich zu sein, habe aber leider nur PHP4.1.2 zur Verfügung.
Stefan
Oder du leitest ein Objekt deiner File Klasse ab und baust dann in der File Klasse wiederum ein Objekt deiner MySQL Klasse, um auf dessen Methoden zuzugreifen (wuerde ich favorisieren, da sauberer).
Habe es versucht:
Leider darf man die Klasse aber nicht bei den "var-Angaben" instanzieren.
class Soundso extends Filesystem
{ var $datenbank = new MySQLDatenbank;
...
}
geht also nicht.
Was funktioniert ist die Instanzierung in einer Methode von class Soundso, dann ist aber die Klasse MySQLDatenbank nur innerhalb dieser Methode gültig und muss von jeder neuen Methode neu instanziert werden. Und PHP hat keinen Destruktor... Mir schwant da Übles mit dem Speicher und der Geschwindigkeit.
Noch eine Idee?
Und PHP hat keinen Destruktor... Mir schwant da Übles mit dem Speicher und der Geschwindigkeit.
Schau Dir mal http://www.php.net/manual/de/language.oop.constructor.php und von da dann http://www.php.net/manual/de/function.register-shutdown-function.php an. Vielleicht hilft's Dir als WorkAround.
Gruss, Thoralf
Hallo Stefan,
es funzt, wenn du statt
class Soundso extends Filesystem{
var $datenbank = new MySQLDatenbank;
}
dieses hier machst:
class Soundso extends Filesystem{
var $datenbank;
function class Soundso(){
$this->$datenbank = new MySQLDatenbank();
}
}
D.h. Einen Konstruktor einbauen, in dem du eine Instanz des der Klasse "MySQLDatenbank()" ableitest. Dann kannst du dieses Objekt in allen Methode nutzen.
Und PHP hat keinen Destruktor... Mir schwant da Übles mit dem Speicher und der Geschwindigkeit.
Ja. destroy() ist wohl erst ab PHP 5 vorgesehen. Da wird der ganze Klassen Schnullifax wohl maechtig aufgebohrt. Generell sind Klassen unter PHP wohl nicht soooo schnell, aber grosse Projekte wie Groupware, diverse Shops usw. sind auch weitestgehend Klassenbasiert (kann also so schlimm nicht sein).
Ich hoffe, ich konnte helfen
Gruesse
Ralf
class Soundso extends Filesystem{
var $datenbank;
function class Soundso(){
$this->$datenbank = new MySQLDatenbank();
}
}
D.h. Einen Konstruktor einbauen, in dem du eine Instanz des der Klasse "MySQLDatenbank()" ableitest. Dann kannst du dieses Objekt in allen Methode nutzen.
Ah, okay. Kapiert. Danke schön. :)
Hab' jetzt schon einen Deiner alten Vorschläge aufgegriffen und drumrum gearbeitet. Mal gucken, ob ich es noch so schön modifiziert kriege.
Stefan
Hallo Stefan,
Quatsch das!
function class Soundso(){
muss natuerlich so heissen:
function Soundso(){
Gruesse
Ralf
Hallo Stefan,
Quatsch das!
Wusste doch, was Du meinst :-).
Gruss,
Stefan