Unique86 Geschrieben 15. Juli 2008 Geschrieben 15. Juli 2008 Hallo Zusammen, ich hab nen Problem mit dem OOP Model in der PHP Version 5.2.4. Ich bin z.Z. dabei ein Framework zu entwicklen uns stoße nach der Konzeption meines Objektmodels auf Probleme bei der Realisierung. Es geht primär um ein Paket das sich um die Datenbankverbindung kümmert. Hierzu habe ich, um möglichst Datenbankunabhängig zu bleiben, ein Interface, eine abstrakte Klasse und zur Zeit zwei konkrete Klassen entwickelt. Ich habe die Kommentare der übersichthalber rausgenommen. Das Interface IDatabaseConnector.class.php interface IDatabaseConnector { public function openConnection(); public function closeConnection(); public function getConnection(); public function isConnected(); } [/php]Die Basisklasse (abstrakte Klasse), die das Interface implementiert BaseDatabaseConnector.class.php [php] abstract class BaseDatabaseConnector implements IDatabaseConnector { protected $_isConnected = false; protected $_connection = null; abstract protected function openConnection(); abstract protected function closeConnection(); public function getConnection() { return $this->_connection; } public function isConnected() { return $this->_isConnected; } }Und zu guter Letzt, die konkrete Klasse für die Verbindung zu einer MySQL Datenbank. Ich habe die zweite Klasse für die Verbindung zur PostGres mal ausgelassen. Sie erbt von der Basisklasse MySQLConnector.class.php class MySQLConnector extends BaseDatabaseConnector { public function openConnection() { // doit } public function closeConnection() { // doit } } [/php]Die Methoden sind natürlich implementiert und beinhalten die dementsprechende Logik. Jetzt bekomme ich während des Interpretiervorgangs folgende Fehlermeldung beim debuggen ... Kompilierungsfehler: [...]\source\de\svenbartak\database\BaseDatabaseConnector.class.php Zeile 49 - Can't inherit abstract function IDatabaseConnector::openConnection() (previously declared abstract in BaseDatabaseConnector)Zeile 49 - ist die Definition der Basisklasse: abstract class BaseDatabaseConnector implements IDatabaseConnector Jetzt meine Fragen: 1) Wie kommt dieser Fehler zustande? 2) Wenn das so nicht funktion, wie kann man es dann realisieren? Dazu sei gesagt das ich sehr Fit im objektorientierten Bereich bin und auch die Prinzipien verstehe. Des weiteren sei gesagt das, dass o.g. Beispiel so wie es da steht, portiert in Java, funktioniert. Bitte keine Verweise auf PEAR o. ähnliche Extensions ... Vielen Dank und ich hoffe es kann mir jemand helfen ... Gruß Sven Zitieren
injac Geschrieben 15. Juli 2008 Geschrieben 15. Juli 2008 In PHP gilt die folgende Regel: Abstrakte Klassen, die von Abstrakten Klassen erben, müssen die Member der Vaterklasse überschreiben, und nicht Überladen. Da Interfaces in PHP "Under the Hood" abstrakte Klassen sind, müsste Deine Implementierung des Interfaces so aussehen (nicht getestet !): abstract class BaseDatabaseConnector implements IDatabaseConnector { protected $_isConnected = false; protected $_connection = null; [B]abstract public function openConnection(); abstract public function closeConnection();[/B] public function getConnection() { return $this->_connection; } public function isConnected() { return $this->_isConnected; } } Zitieren
Unique86 Geschrieben 16. Juli 2008 Autor Geschrieben 16. Juli 2008 In PHP gilt die folgende Regel: Abstrakte Klassen, die von Abstrakten Klassen erben, müssen die Member der Vaterklasse überschreiben, und nicht Überladen. Da Interfaces in PHP "Under the Hood" abstrakte Klassen sind, müsste Deine Implementierung des Interfaces so aussehen (nicht getestet !): abstract class BaseDatabaseConnector implements IDatabaseConnector { protected $_isConnected = false; protected $_connection = null; [B]abstract public function openConnection(); abstract public function closeConnection();[/B] public function getConnection() { return $this->_connection; } public function isConnected() { return $this->_isConnected; } } Hallo, erstmal vielen Dank für Deine Antwort. Mir ist die Nacht dieses Thema über den Weg gelaufen, in der die gleiche Thematik besprochen wird: PHP Bugs: #41145: Interface, Abstract Class & Methods Ist wohl bekannt aber wird wohl nie geändert werden. Hab mir nen work-around gebastelt - das Thema kann als gegenstandslos betrachtet werden. Danke .... Gruß Sven Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.