php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.12.2008, 15:58  
Neuer Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 16
ciss befindet sich auf einem aufstrebenden Ast
Standard Downcasting?

Hi,

in einem CMS gibt es eine Klasse ParentA und ParentB. Beide Klassen habe ich erweitert, ChildA und ChildB.
Einige Methoden von ParentA liefern ein Objekt ParentB zurück, umgekehrt liefern manche Methoden in ParentB ein ParentA-Objekt zurück.
Nun brauche ich als Rückgabe aber ChildA bzw. ChildB als Rückgabewert. Ein Überschreiben der betreffenden Methoden kommt nicht in Frage, der Aufwand wäre zu groß.
Ich möchte daher von ParentA nach ChildA bzw. von ParentB nach ChildB casten. Die Frage ist nur: wie?

Eine dreckige Lösung wäre ja, das zurückgegebene Objekt zu serialisieren und im String dann die Klassenbezeichnung zu ersetzen. Geht das noch eleganter?

Weihnachtliche Grüße
Fabian
ciss ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 26.12.2008, 16:19  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
umgekehrt liefern manche Methoden in ParentB ein ParentA-Objekt zurück.
ein new ParentA;-Objekt?
Dann ist es kein ChildA und downcasting hilft Dir nichts.

Ansonsten ist das in PHP (bisher) nicht notwendig, da Du kein Typehinting für Rückgabewerte verwenden kannst.
David ist offline   Mit Zitat antworten
Alt 26.12.2008, 17:08  
Neuer Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 16
ciss befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Dann ist es kein ChildA und downcasting hilft Dir nichts.
Kann dir da nicht ganz folgen. Als Kindklasse beinhaltet ChildA doch alle Eigenschaften von ParentA. Oder habe ich eine falsche Vorstellung vom Begriff "downcasting"?
Jedenfalls erledige ich das vorläufig mit der folgenden Funktion, hoffe aber dennoch auf eine bessere Lösung.

PHP-Code:
function a421_cast($object$cast_to)
{
    
$class get_class($object);
    
$class 'O:'.strlen($class).':"'.$class;
    
$cast_to 'O:'.strlen($cast_to).':"'.$cast_to;
    
$object serialize($object);
    
$object str_replace($class$cast_to$object);
    return 
unserialize($object);

ciss ist offline   Mit Zitat antworten
Alt 26.12.2008, 18:11  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo ciss,

wenn du solche "dreckigen" Methoden nutzen musst, ist das Softwaredesign unbrauchbar. Mache dir bitte Gedanken über die Architektur oder gib uns ein paar mehr Informationen, dass wir darüber diskutieren können.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 26.12.2008, 18:14  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Das hört sich stark nach einem Cheat an, ist dann aber wohl die einzige Lösung.

Um es richtig zu machen hätte die Grundlage besser sein müssen, aber das ist nicht leicht hinzubekommen. Das wissen alle, die mal versucht haben (oder gerade versuchen) ein Framework zu basteln.

Edit: Ja doc, so drastisch wollte ich es nicht ausdrücken... Er meinte er kann es nicht ändern, daher denke ich nicht dass es von ihm stammt.
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 26.12.2008, 20:02  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Phlegma
Edit: Ja doc, so drastisch wollte ich es nicht ausdrücken... Er meinte er kann es nicht ändern, daher denke ich nicht dass es von ihm stammt.
Das mag ja drastisch klingen, aber es ist so.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 26.12.2008, 20:41  
Neuer Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 16
ciss befindet sich auf einem aufstrebenden Ast
Standard

Phlegma hat leider recht, das zugrundeliegende Design ist nicht von mir. Es ist meines Wissens im Laufe der Zeit auch etwas "gewachsen" (oder gewuchert). Daher sind einige wichtige Funktionen zum Bearbeiten von Artikeln derart mit dem Backend verzahnt, dass das Erstellen eigener spezieller Eingabemasken unmöglich ist.
Ich bin daher gerade dabei, für eine Blog-Erweiterung zwei der neueren Klassen um die fehlende Funktionalität zu erweitern in der Hoffnung, dass diese in zukünftige Versionen übernommen werden.
Es handelt sich also um eine Übergangslösung, die dennoch halbwegs performant arbeiten sollte.
ciss ist offline   Mit Zitat antworten
Alt 26.12.2008, 21:46  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Zitat von ciss Beitrag anzeigen
Kann dir da nicht ganz folgen. Als Kindklasse beinhaltet ChildA doch alle Eigenschaften von ParentA.
Wenn Du ein ChildA-Objekt hast, ja. Aber genau das ist ja meine Frage. Downcasting bedeutet ja "nur", dass irgendwo auf dem Weg die Information "Hey, ich bin nicht nur ein blödes ParentA, ich bin ein ChildA" verloren gegangen ist und wiederhergestellt wird. Und genau dieses Wiederherstellen ist in PHP nicht notwendig, da die Information eh nicht maskiert wird.
Soweit ich das verstanden habe, willst Du kein Downcasting, sondern eine Erweiterung oder Modifikation - eben weil Du kein ChildA-Objekt hast.
David ist offline   Mit Zitat antworten
Alt 27.12.2008, 10:26  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

@ciss: war/ist ja auch kein persönlicher Vorwurf gegen dich. In diesem Fal bist du dann natürlich leider dem schlechten Design ausgeliefert.

Zitat:
Zitat von David
Soweit ich das verstanden habe, willst Du kein Downcasting, sondern eine Erweiterung oder Modifikation - eben weil Du kein ChildA-Objekt hast.
Ich denke auch, dass die Erweiterung der Basis-Klasse von der du erbst sinnvoller sein wird.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 27.12.2008, 15:30  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Aber nur der Vollständigkeit halber: Dass Du den Laufzeittypen nicht ändern kannst, ist kein Naturgesetz
Es gibt durchaus Sprachen, in denen das möglich (oder sogar gängige Praxis) ist. Smalltalk zum Beispiel.
David 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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
downcasting, php downcasting, php down casting, php objekt casten

Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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