• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Interfaces, abstrakte und konkrete Klassen - Fehler im PHP5 OOP Model ?

Status
Für weitere Antworten geschlossen.

boehseronkel

Neues Mitglied
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

PHP:
interface IDatabaseConnector
{
    public function openConnection();
    public function closeConnection();
    public function getConnection();
    public function isConnected();
}
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

PHP:
class MySQLConnector extends BaseDatabaseConnector
{
    public function openConnection()
    {
            // doit
    }
    
    public function closeConnection()
    {
            // doit
    }
}
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::eek:penConnection() (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
 
Werbung:
vllt weil die funktion erst "protected" und dann plötzlich "private" ist? ^^
 
vllt weil die funktion erst "protected" und dann plötzlich "private" ist? ^^

Hallo,

zum einen gibt es in einer Klasse keine "Funktionen" die Dinger nennt man "Methoden" (Auch wenn sie als "function" deklariert sind.

Desweiteren ist keine o.g. Methode erst "protected" und dann "private". Alle Methoden in einem Interface müssen public sein - alles andere wäre sinnfrei.

Die Methoden der Basisklasse, die als "abstract protected" deklariert sind, dienen zur Vererbung bzw. sind für die Vererbung freigegeben - "public" macht da wenig bis keinen Sinn.

Demnach ist Deine Hilfestellung leider nicht brauchbar :)

Danke dennoch ...

Gruß Sven

P.S. Ich hatte oben ausdrücklich erwähnt das ich mich in der Objektmodelierung extrem gut auskenne und die Prinzipien der OOP verstehe als das mir dieser Fehler unterlaufen würde ;)
 
Werbung:
Wenn eine Klasse abstrakt ist, kann man von ihr keine Instanz erzeugen. Wenn man von einer abstrakten Klasse erbt, so ist die erbende Klasse ebenfalls abstrakt (Es sei denn, man überschreibt alle Methoden aus der abstrakten Klasse). Ergo kannst du keine Instanz von MySQLConnector erstellen.

Ach und noch was, wenn du kein Objekt instanzieren kannst, wozu setzt du dann in der abstrakten klasse Attribute? Attribute sind objektspezifische Werte.
 
Hallo Frank,

Wenn eine Klasse abstrakt ist, kann man von ihr keine Instanz erzeugen. Wenn man von einer abstrakten Klasse erbt, so ist die erbende Klasse ebenfalls abstrakt (Es sei denn, man überschreibt alle Methoden aus der abstrakten Klasse). Ergo kannst du keine Instanz von MySQLConnector erstellen.

das ist aber absoluter Bullshit.Entschuldige das ich das so sage ...

Eine Basisklasse (Abstrakte Klasse) stellt Attribute, Methoden und Methodensignaturen für konkrete, erbende Klassen, die durchaus instantiiert werden können und sogar müssen, bereit.

Ach und noch was, wenn du kein Objekt instanzieren kannst, wozu setzt du dann in der abstrakten klasse Attribute? Attribute sind objektspezifische Werte.

Die Werte die in einer Basisklasse (siehe oben) gesetzt werden, sind für alle abgeleiteten Klassen zur Verfügung!

Noch nie etwas von Vererbung gehört?

Ich glaube wenn ja, herrscht hier Nachholbedarf.

Ergänzung:
Überleg Dir doch mal einen Anwendungsfall in dem es Sinn macht eine "konkrete" (also nicht abstrakte Klasse) zur Basisklasse zu machen.
Wieso sollte man "Obst" instantiierbar machen wenn es doch Äpfel und Birnen gibt?

Gruß Sven
 
Ich zitiere
Von solchen abstrakten Klassen B kann man keine Instanz erzeugen. Von abstrakten Klassen kann man auch erben (extends). Die erbende Klasse A ist auch wieder abstrakt, es sei denn, alle von B geerbten abstrakten Methoden wird in A implementiert. In diesem Fall kann man von A auf die gewohnte Weise Instanzen bilden.
 
Werbung:
wo ist denn bitte hier die Methode getConnection und isConnected implementiert ? :
PHP:
class MySQLConnector extends BaseDatabaseConnector
{
    public function openConnection()
    {
            // doit
    }
    
    public function closeConnection()
    {
            // doit
    }
}

Sorry aber ich find die nicht, und somit ist MySQLConnector abstrakt.
 
Hallo Frank,

also nochmal ...
Ich zitiere mal Dein Zitat:

Von solchen abstrakten Klassen B kann man keine Instanz erzeugen. Von abstrakten Klassen kann man auch erben (extends). Die erbende Klasse A ist auch wieder abstrakt, es sei denn, alle von B geerbten abstrakten Methoden wird in A implementiert. In diesem Fall kann man von A auf die gewohnte Weise Instanzen bilden.
Die Stellen an denen es interessant wird habe ich fett hervorgehoben.

Wie Du nun siehst sind beide abstrakten Methoden "openConnection" und "closeConnection" in der konkreten Klasse vorhanden. Die Basisklasse implementiert aber nun noch zwei Methoden, die alle erbenden Klassen, ohne sie überschreiben zu müssen, nutzen können.

Es geht hier also nicht um die bereits in der abstrakten Klasse implementierten Methoden getConnection und isConnected.
Diese sind nämlich in dieser Hinsicht völlig irrelevant.

wo ist denn bitte hier die Methode getConnection und isConnected implementiert ? :
PHP:
class MySQLConnector extends BaseDatabaseConnector
{
    public function openConnection()
    {
            // doit
    }
    
    public function closeConnection()
    {
            // doit
    }
}
Sorry aber ich find die nicht, und somit ist MySQLConnector abstrakt.

Somit ist meine Klasse "MySQLConnector" in Anlehung an Deine Aussage - nicht - abstrakt ;)

Gruß Sven
 
Zuletzt bearbeitet:
Werbung:
im php manual habe ich folgenden kommentar gefunden, welcher deine fehlermeldung erklärt:

"Chris AT w3style DOT co.uk
07-Dec-2006 02:25 Note that you can extend interfaces with other interfaces since under-the-hood they are just abstract classes:"

und

"
tobias_demuth at web dot de
04-May-2005 11:21 The statement, that you have to implement _all_ methods of an interface has not to be taken that seriously, at least if you declare an abstract class and want to force the inheriting subclasses to implement the interface.
Just leave out all methods that should be implemented by the subclasses. But never write something like this:

<?php

interface Foo {

function bar();

}

abstract class FooBar implements Foo {

abstract function bar(); // just for making clear, that this
// method has to be implemented

}

?>

This will end up with the following error-message:

Fatal error: Can't inherit abstract function Foo::bar() (previously declared abstract in FooBar) in path/to/file on line anylinenumber"

HTH
 
Danke für den Hinweis ...

Das stärkt meinen Gedanken das die OOP Umsetzung innerhalb PHP5 noch sehr mager ist...

Dann hat sich das Problem erledigt ... werd wohl nen Work-Around bauen ...

Gruß Sven
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben