Portal > Foren > PHP > PHP-Programmierung > Interfaces, abstrakte und konkrete Klassen - Fehler im PHP5 OOP Model ?
Antwort
 
Themen-Optionen
Alt 15.07.2008, 20:23 Nach oben    #1
Sven Bartak
 
Benutzerbild von boehseronkel
 
Registriert seit: 05.09.2006
Ort: Holzwickede
Beiträge: 16
Standard Interfaces, abstrakte und konkrete Klassen - Fehler im PHP5 OOP Model ?

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-Code:
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-Code:
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-Code:
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 ...

Zitat:
Kompilierungsfehler: [...]\source\de\svenbartak\database\BaseDatabaseConnect or.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
__________________
...with best regards...

Sven Bartak
junior software engineer

Address » Dorfstraße 37, D-59439 Holzwickede | Mail » info[AT]svenbartak[DOT]de | Web
» http://www.svenbartak.de
boehseronkel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2008, 20:34 Nach oben    #2
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 199
Standard

Hm mal versucht im Interface die entsprechenden Funktionen mit dem abstract-Stichwort zu schreiben?
FloB ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2008, 21:11 Nach oben    #3
Sven Bartak
 
Benutzerbild von boehseronkel
 
Registriert seit: 05.09.2006
Ort: Holzwickede
Beiträge: 16
Standard

Hallo,

Zitat:
Zitat von FloB Beitrag anzeigen
Hm mal versucht im Interface die entsprechenden Funktionen mit dem abstract-Stichwort zu schreiben?
nein das habe ich noch nicht versucht und mir verschließt sich gerade auch noch nicht der tiefere Sinn wenn ich das machen sollte.

Abstrakte Methodensignaturen innerhalb eines Interfaces?

Gruß Sven
__________________
...with best regards...

Sven Bartak
junior software engineer

Address » Dorfstraße 37, D-59439 Holzwickede | Mail » info[AT]svenbartak[DOT]de | Web
» http://www.svenbartak.de
boehseronkel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2008, 21:51 Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 199
Standard

Ungetestet:
PHP-Code:
interface IDatabaseConnector
{
    abstract public function 
openConnection();
    abstract public function 
closeConnection();
    public function 
getConnection();
    public function 
isConnected();


Edit: Mir fällt gerade auf, dass die Sichtbarkeiten anders sind, in deiner Klasse sind die Methoden protected, im Interface public.
FloB ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2008, 22:22 Nach oben    #5
Sven Bartak
 
Benutzerbild von boehseronkel
 
Registriert seit: 05.09.2006
Ort: Holzwickede
Beiträge: 16
Standard

Danke für den Hinweis aber das weiß ich und es ist so gewollt
Selbst bei public Deklaration in der Basisklasse würde das nix ändern ...

Zu Deinem Tip, es macht kein Sinn in einem Interface eine Methodensignatur "abstract" zu setzen ... das ist leider Sinnfrei

Hab mir jetzt nen Workaround geschaffen und das Problem umgangen ...

Gruß Sven
__________________
...with best regards...

Sven Bartak
junior software engineer

Address » Dorfstraße 37, D-59439 Holzwickede | Mail » info[AT]svenbartak[DOT]de | Web
» http://www.svenbartak.de
boehseronkel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2008, 23:35 Nach oben    #6
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

Ist mit php nicht möglich und wird wohl auch so bleiben wenn man sich diese Bug-Meldung und den Kommentar dazu anschaut:

-> http://bugs.php.net/bug.php?id=41145
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.07.2008, 07:31 Nach oben    #7
Sven Bartak
 
Benutzerbild von boehseronkel
 
Registriert seit: 05.09.2006
Ort: Holzwickede
Beiträge: 16
Standard

Zitat:
Zitat von robo47 Beitrag anzeigen
Ist mit php nicht möglich und wird wohl auch so bleiben wenn man sich diese Bug-Meldung und den Kommentar dazu anschaut:

-> http://bugs.php.net/bug.php?id=41145
Hallo,

ja vielen Dank - bin diese Nacht auch noch auf den Beitrag gestoßen.

Gruß Sven
__________________
...with best regards...

Sven Bartak
junior software engineer

Address » Dorfstraße 37, D-59439 Holzwickede | Mail » info[AT]svenbartak[DOT]de | Web
» http://www.svenbartak.de
boehseronkel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
OOP: Abstrakte Klasse ljungi PHP-Programmierung 9 10.05.2006 22:44


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:43 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44