Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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;

    }

}  

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

Gern geschehen .

Gruß,

Ilija

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.