Zum Inhalt springen

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


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

    }

}  

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...