Funktion einer Objektintanz überladen

DJLopez

Mitglied
Moin,

ich habe ein Objekt, welches eine Methode hat, und mit einer anderen, nicht vorhandenen, Methode aufgerufen werden soll. Beispiel:
PHP:
$foo = new Foo();
$foo->methodeA(); //gibt es
$foo->methodeB(); // gibt es nicht!

Wie schaffe ich es, dass beim Aufruf der methodeB() die methodeA() aufgerufen wird?

An der Klasse kann/darf ich nichts ändern! Daher muss das "im laufenden Betrieb" passieren.

Hat jmd ne Idee?
 
Hallo,

ich verstehe dich gerade nicht so ganz. Du kannst eigentlich keine Methode aufrufen die es nicht gibt. Überladen ist eigentlich auch was ganz anderes.

Könntest du vielleicht mal an einem Beispiel zeigen was du möchtest?

MFG

Sascha
 
Es geht um folgendes:

Ich habe 2 Datenbankanbindungen mit jeweils unterschiedlichen Abstraktionslayern. Ich muss nun "im Betrieb" entscheiden, welchen in nehmen will, bzw. im Kontruktor wird entschieden, welcher Layer genommen werden soll. Dies soll sich aber nicht auf den restlichen Code auswirken (da der schon quasi fertig ist... dolle Sache).

Da die Layer aber unterschiedliche Funktionen haben, muss ich "irgendwie" dafür sorgen, dass die korrekte Methode aufgerufen wird.

Daher ist mein Gedanke relativ einfach: methodeB() in das Objekt reinpacken, die dann methodeA() aufruft. Da ich aber nicht die Klasse verändern kann, muss ich das halt "im Betrieb" machen. In Javascript ginge das ja ganz einfach (vereinfacht dargestellt):
Code:
var foo.methodeA = function(){methodeA()}

Ich glaube aber langsam, dass das bei PHP nicht vorgesehen ist. Die einzige mir bekannte Möglichkeit wäre, eine Klasse zu programmieren, die die entsprechenden Funktionen bereitstellt... aber selbst das würde doch viel Arbeit mit sich ziehen... :(
 
Tut mir leid, ich verstehe aber immer noch nicht, was MethodeB machen soll. Warum rufst du nicht direkt MethodeA auf.

Ich weiß nicht mit welcher PHP-Version du arbeitest, aber ich denke mit Interfaces wäre dir schon mal gut geholfen.

MFG

Sascha
 
Ok, ich versuchs nochmal ganz einfach :)

* methodeB() existiert nicht
* methodeB() soll NUR methodeA() aufrufen
* kann ich eine Methode in ein Objekt "einhängen" bzw "anhängen" - also OHNE die Klasse selber zu verändern?
 
Das hab ich schon verstanden. Ich verstehe aber nicht warum du das machen möchtest. Dann kannst du doch auch direkt MethodeA aufrufen.

Für mich sieht es im Moment so aus, als wäre das Design des Programms nicht sehr durchdacht.


Schau dir mal AOP mit PHP an. Das könnte dir eventuell helfen.

MFG

Sascha
 
Ich verstehe aber nicht warum du das machen möchtest. Dann kannst du doch auch direkt MethodeA aufrufen.

Es geht darum:
Der Code sollte eigentlich nur an einer Stelle benutzt werden, mit einem DB Abstraktionslayer. Jetzt soll der Code so für eine andere Stelle wiederbenutzt werden, ohne DIREKT im Code was zu ändern. Es ist quasi so oder so ein Hack :)

Im Quellcode wird sowas wie
PHP:
$foo->DB->fetch_row($sql)
aufgerufen.

Das funktioniert für den ersten, "normalen" Einsatzzweck. Wird das Script an anderer Stelle, mit einem anderen Abstraktionslayer geladen, existiert dort die Methode "fetch_row()" nicht, sondern nur - festhalten - "fetchRow()". Ohne jetzt an die Klasse zu müssen - was auch nicht vorgesehen ist - will ich einfach nur die Funktion "fetch_row()" anhängen, die "fetchRow()" aufruft :)

Ich vermute, es ist ein Error-by-design, und ich muss NOCH eine Abstraktionsschicht für die Abstraktionsschichten einbauen - LOL :)
 
und ich muss NOCH eine Abstraktionsschicht für die Abstraktionsschichten einbauen
Entweder das, oder du überarbeitest den Code nochmal. Falls du mit PHP5 arbeitest, würde ich dir raten Interfaces zu nutzen.

MFG

Sascha
 
Zurück