php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.12.2010, 18:31  
Neuer Benutzer
 
Registriert seit: 27.12.2010
Beiträge: 19
PHP-Kenntnisse:
Fortgeschritten
automatix befindet sich auf einem aufstrebenden Ast
Standard Problem mit abstrakter Funktion und Vererbung

Hallo zusammen!

In einer (Zend Framework) Anwendung habe ich eine abstrakte Klasse AX_Model_Mapper mit der Funktion

PHP-Code:
abstract public function save(AX_Model_Model $modelObject); 
Von dieser Klasse erbt u.a die Klasse Application_Model_StatusMapper, die die o.g. Methode implementiert:

PHP-Code:
    public function save(Application_Model_Status $status) {
        
// ...
    

Die Application_Model_Status erbt von der AX_Model_Model, ist also kompatibel mit ihr kompatibel.

Leider funktioniert es nicht und führt zum Fehler:

Zitat:
Fatal error: Declaration of Application_Model_StatusMapper::save() must be compatible with that of AX_Model_Mapper::save() in M:\workspace\arrows\simpletodolist\application\mod els\StatusMapper.php on line 5
Warum?

Danke
automatix ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.12.2010, 18:50  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von automatix Beitrag anzeigen
Warum?
Weil du klar und deutlich angegeben hast, dass die Methode save ein Objekt vom Typ AX_Model_Model als Parameter übergeben bekommen wird - und sie nun aber doch davon abweichend zu implementieren versuchst, nämlich mit einem Parameter vom Typ Application_Model_Status.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 27.12.2010, 19:18  
Neuer Benutzer
 
Registriert seit: 27.12.2010
Beiträge: 19
PHP-Kenntnisse:
Fortgeschritten
automatix befindet sich auf einem aufstrebenden Ast
Standard

Aber die Application_Model_Status ist doch eine Unterklasse von AX_Model_Model, muss also zuweisungskompatibel sein, oder?
automatix ist offline   Mit Zitat antworten
Alt 27.12.2010, 19:33  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,

PHP kennt zur Zeit des Parsens deine Klassenabhängigkeiten aber nicht. Ein Interface wäre da deutlich sinnvoller als Type Hint. Mit Interfaces hat es das ZF aber leider nicht so.

Workaround:
PHP-Code:
<?php
public function save(AX_Model_Model $modelObject) {
  if (!
$modelObject instanceof Application_Model_Status) {
    throw new 
InvalidArgumentException("..");
  }
  
// ..
}  
?>
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 27.12.2010, 19:44  
Neuer Benutzer
 
Registriert seit: 27.12.2010
Beiträge: 19
PHP-Kenntnisse:
Fortgeschritten
automatix befindet sich auf einem aufstrebenden Ast
Standard

Aha... Wieder was dazugelernt... Habe das jetzt so gelöst, dass das Argument der Application_Model_StatusMapper#save(...) auch vom Typ AX_Model_Model ist. Aber es ist dirty...

Wenn ich anstatt von abstrakten Klassen Interfaces verwende, dürfte ich wohl auch nicht viel gewinnen. Das Problem bleibt das gleiche. Außerdem ist eine abstrakte Klasse (die auch ein paar konkrete Methoden enthält und vererbt) hier keine schlechte Lösung, finde ich.

Nachtrag:
Ja, der Workaround ist gut, danke!

PHP-Code:
// konkrete Klasse Application_Model_StatusMapper
public function save(AX_Model_Model $status) {
    if (!
$status instanceof Application_Model_Status) {
        throw new 
InvalidArgumentException("..");
    }
    
// ...


Geändert von automatix (27.12.2010 um 19:50 Uhr).
automatix ist offline   Mit Zitat antworten
Alt 28.12.2010, 08:42  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Beim Überschreiben müssen die Methodensignaturen übereinstimmen. Die Parameter gehören auch zur Signatur. Daher: Anderer Parameter = andere Signatur = kein Überschreiben.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 28.12.2010, 10:43  
Neuer Benutzer
 
Registriert seit: 27.12.2010
Beiträge: 19
PHP-Kenntnisse:
Fortgeschritten
automatix befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mquadrat Beitrag anzeigen
Beim Überschreiben müssen die Methodensignaturen übereinstimmen. Die Parameter gehören auch zur Signatur. Daher: Anderer Parameter = andere Signatur = kein Überschreiben.
Klar, sonst heißt es Überladen. Der Workaround oben ist ein Versuch, das im PHP nicht vorhandene Überladen zu simulieren.
automatix ist offline   Mit Zitat antworten
Alt 28.12.2010, 10:54  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Überladen und Überschreiben meint hier das gleiche. Was mquadrat gesagt hat, ist universell richtig: Bei unterschiedlicher Methodensignatur gibt es keine Überladung, da es sich um 2 unterschiedliche Methoden handelt, das gilt in allen OO Sprachen gleichermassen. Genauso kann man keine 2 Funktionen mit gleicher Methodensignatur im global scope deklarieren, das wird auch mit einem Fehler quitiert.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 28.12.2010, 12:36  
Neuer Benutzer
 
Registriert seit: 27.12.2010
Beiträge: 19
PHP-Kenntnisse:
Fortgeschritten
automatix befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Überladen und Überschreiben meint hier das gleiche.
"Überladen" und "Überschreiben" sind zwei ganz verschiedene Paar Stiefel. Auch hier.

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Bei unterschiedlicher Methodensignatur gibt es keine Überladung, da es sich um 2 unterschiedliche Methoden handelt, das gilt in allen OO Sprachen gleichermassen.
Das Überladen gib es ausschließlich bei unterschiedlicher Methodensignatur (der gleichnamigen Methoden). OO-Sprachen, in denen es anders ist, sind mir nicht bekannt.

Das Problem ist hier aber ein designtechnisches. Mir ist ein ein logischer Fehler unterlaufen: das, was ich anfangs versucht habe, geht in keiner Programmiersprache, denn die implementierende Methode muss die zu implementierende Methode nicht nur überladen (was in PHP eh nicht geht), sondern überschreiben.
automatix ist offline   Mit Zitat antworten
Alt 29.12.2010, 14:05  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von automatix Beitrag anzeigen
denn die implementierende Methode muss die zu implementierende Methode nicht nur überladen (was in PHP eh nicht geht), sondern überschreiben.
Sag ich doch
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Tabellen Problem mit Funktion Schadstoff PHP Tipps 2009 5 04.06.2009 20:12
clearInterval problem (in funktion) railon JavaScript, Ajax und mehr 3 27.05.2009 00:35
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
Problem: UPDATE-Abfrage in externer Funktion cheaterfritz PHP Tipps 2009 5 03.04.2009 14:56
[Erledigt] Problem mit der Funktion fopen() robat PHP Tipps 2008 6 23.11.2008 12:29
Problem beim Aufruf einer Funktion elwood PHP Tipps 2008 6 30.08.2007 12:54
Problem mit Funktion Kein Genie PHP Tipps 2007 33 12.03.2007 15:10
problem mit einer Funktion LP PHP Tipps 2006 9 27.06.2006 12:56
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
[Erledigt] Problem bei Massenmails versenden mit der Funktion mail PHP-Fortgeschrittene 3 19.01.2005 13:36
problem mit der "die" funktion aircrash PHP Tipps 2005 2 08.01.2005 19:44
Problem mit Umsetzung einer Funktion Datenbanken 1 20.12.2004 14:37
problem mit update funktion aircrash PHP Tipps 2004-2 3 17.11.2004 16:55
Problem mit Funktion PHP Tipps 2004 3 17.07.2004 14:30
Problem mit mail() - Funktion PHP Tipps 2004 2 06.07.2004 18:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php abstrakte funktion, zend vererbung, php methodensignatur, php abstrakte funktionen, php vererbung signatur ändern, php funktionen überladen, abstrakte funktion, php funktion überladen, php funktionen überladen workaround, abstrakte funktion parameterliste, php vererbung funktion, php instanceof vererbung, parameter vererbung php 5, methode überschreiben anderen parametern delphi, js abstrakte funktionen, php abstrakte funkton überschreiben, methodensignatur vererbung, php function vererbung, abstrakte funktionen php, php vererbung überschreiben

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum