Methode einer anderen Klasse hinzufügen

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
825
Hallo,

ich möchte gern eine Methode in einer anderen Klasse von meiner Klasse hinzufügen.

Beispiel:

PHP:
Class MyClass {
    public function myFunction() {
        ???
    }
}

Class OtherClass {
    public test1();
    public test2();
    public test4();
}

In OtherClass fehlt nun die Methode test3(). Wie kann ich diese über meine Methode myFunction() hinzufügen?
Ich möchte Aufgrund von Update/Upgradefähigkeit nichts an der Klasse OtherClass ändern.
 
Ich bin nicht sicher, ob ich dein Problem verstehe. Grundsätzlich kannst du einer Klasse nichts von einer anderen Klasse aus "hinzufügen". Wenn du deine Ursprungsklasse erweitern willst, ohne sie zu verändern, wäre Vererbung das Stichwort, also in etwa:

Code:
class MyClass extends OtherClass {

    public test3() {
        // …
    }

}

Aber wie gesagt: Ich bin nicht sicher, worauf das Ganze bei dir hinauslaufen soll. 🤔

Gruß Jens
 
  • Gefällt mir
Reaktionen: wahli und Revan1710
Deine Problembeschreibung ist etwas wirr und unvollständig, deswegen wirst du jetzt mit meiner u.U. unbefriedigenden Antwort leben müssen:

Du leitest von Class OtherClass ab und fügst der Ableitung einfach die Methode public test3(); mit entsprechendem Code hinzu.
 
  • Gefällt mir
Reaktionen: wahli
Ich möchte die Methode test3() bei mir nutzen, aber auch in der OtherClass hinzufügen ohne dort direkt eingreifen zu müssen. Ist leider eines Upgrades eines CMS geschuldet. Vererbung ist hier glaube nicht möglich.

Vielleicht wird folgendes Beispiel deutlicher. Folgender Zustand ist:

PHP:
Class MyClass {
    public function myFunction() {
        $test = ....; // von OtherClass instanziert
        $test->test3['test'] = 'Werte hier eintragen';
    }
}

Das schlägt jedoch fehl, weil es die Methode test3() bei OtherClass nicht gibt.
 
ExtendedOtherClass extends OtherClass
sowie die Methode test3() dort implementieren.

Jetzt hat die abgeleitete Klasse alle Methoden von OtherClass und zusätzlich die Methode test3() und du musst dann die abgeleiteten Klasse verwenden:

Class MyClass {
public function myFunction() {
$test = ....; // von ExtendedOtherClass instanziert
$test->test3['test'] = 'Werte hier eintragen';
}
}
 
Hm, ich verstehe es immer noch nicht (bin aber auch kein Profi).
Wenn einer Klasse eine Funktion fehlt, erweitere ich sie mittels Vererbung oder schreibe sie um. Eine Klasse mit so etwas wie "Code-Injection" zu erweitern, ist zumindest bei den Sprachen, mit denen ich ich arbeite, meines Wissens nicht möglich (und würde m.E. auch dem Prinzip der Kapselung widersprechen).

Ich lasse mich gerne eines Besseren belehren, aber wenn du zu solchen Konstrukten glaubst greifen zu müssen, stimmt vermutlich in den Ausgangsklassen schon etwas nicht.

Gruß Jens
 
php kann doch Vererbung
 
Geht nicht. Du kannst höchstens von der Klasse erben und dann Objekte deiner Klasse rumreichen, aber die andere Klasse kannst du nicht von außen modifizieren.
Schumiel schrieb:
Ich möchte Aufgrund von Update/Upgradefähigkeit nichts an der Klasse OtherClass ändern.
Dann bau dir eine Abstraktion in deinem Projekt, damit du eben nicht direkt von deinen Abhängigkeiten abhängig bist. Morgen ist die Abhängigkeit nämlich unmaintained, du findest Ersatz und fängst nun an tausende Stellen anzupassen. Bau dir ne eigene API, die bewerkstelligt was du willst und lass diese die Dependencies nutzen. Dann änderst du nämlich nur an einer Stelle und nicht kreuz und quer im Projekt.
 
uburoi schrieb:
Wenn einer Klasse eine Funktion fehlt, erweitere ich sie mittels Vererbung oder schreibe sie um. Eine Klasse mit so etwas wie "Code-Injection" zu erweitern, ist zumindest bei den Sprachen, mit denen ich ich arbeite, meines Wissens nicht möglich (und würde m.E. auch dem Prinzip der Kapselung widersprechen).
Geht schon, nennt sich Introspection, Reflection, manchmal auch anders. Auch bei C++ kannst du z.B. auf ein privates Attribut zugreifen wenn du nur wirklich willst. Das ist aber alles gruselig und diese Art von Meta-Prgramming macht man eigentlich nur wenn man sich sicher ist, dass das genau das ist was man will.
 
  • Gefällt mir
Reaktionen: KitKat::new()
Klingt jedenfalls nicht nach gutem Stil und einer Empfehlung für das oben genannte Problem. ☺️

Gruß Jens
 
  • Gefällt mir
Reaktionen: Sonnenkarma und BeBur
Keep it simple, wenn eine Funktion in vielen Klassen genutzt wird ist doch das einfachste diese Funktion einfach global außerhalb aller Klassen zu haben und die nötigen Daten werden per Referenz übergeben.
 
Nix global- internal static class Sonstewas, statische Methoden da rein und dann verwenden 😉

Kann man “global” nennen, aber in OO gibts kein global.

Aber aufpassen daß man sich nicht verrennt! Das wird mit Pech und ohne Disziplin zu Spaghetticode.
Logische Zusammenhänge gilt es zu wahren. Eine Klasse für alles ist immer schlechter Stil, das gilt insbesondere auch für statische.
 
Nach einer runde Schlaf habe ich die Lösung gefunden.

PHP:
class MyExtClass extends OtherClass {

    public $test3 = [];

}

Danke für eure Hilfen.
 
Ging es nicht darum die Funktion test3() in OtherClass "reinzukriegen"? MyExtClass erbt jetzt von OtherClass und dort wird die Variable bzw. im konkreten Fall das leere Array $test3 definiert.

Ich komm nicht mehr mit. Falls du Vererbung mit deinem CMS nutzen kannst, wäre die richtige Lösung dann nicht sowas wie?
PHP:
class MyOtherClass extends OtherClass {
    public function test3() {
      // do something here
    }
}

Oder definierst du nur die Variable $test3, der du dann eine beliebige Funktion zuordnest, die dann ausgeführt wird? Ich finde, dass dieses Konstrukt aussieht, als würde es sich eines Tages rächen.

Update:
Warum implementierst du die Funktion test3 nicht direkt in OtherClass? Vielleicht würden dir hier ein paar Design-Patterns wie bspw. das Strategy Pattern weiterhelfen.
 
RalphS schrieb:
Kann man “global” nennen, aber in OO gibts kein global.
man muss nicht immer OOP nutzen genau das war der Vorschlag, php beherrscht auch normale Funktionen.
Viele Klassen haben Thematisch keinerlei Verbindung die muss man dann auch nicht unbedingt für eine Funktion miteinander verwursteln. Es gibt doch Themenunabhängige Funktionen wie zB Vergleich von floatings da ist eine normale Funktion einfach am einfachsten und die Klassen können sich in Ruhe lassen.
 
Wo genau ist das jetzt nicht Verbung was dir vorher alle Leute empfohlen haben und du aber kategorisch ausgeschlossen?
 
T_55 schrieb:
man muss nicht immer OOP nutzen genau das war der Vorschlag, php beherrscht auch normale Funktionen.

Okay, da geh ich mit, ich hatte mich konkret auf OO festgelegt, weil irgendwie Mischmasch ist am Ende nur noch Spaghetti. Auch ohne goto.

Aber konkret globale Variablen sollte man IMO immer meiden und wenn man OO nutzt, egal in welcher Form, nochmal ein bißchen extra.

Nichts ist schlimmer als Konstrukte wie
PHP:
function MyFunction()
{
return ( $a + $b % $c ) . $d
}

wo man nicht weiß was es tut, wo die Daten herkommen, was das für Daten sein sollen, obs überhaupt erstmal numerische Daten sind oder was der Bursch von einem Coder überhaupt erreichen wollte damit.

Es hält einen aber niemand davon ab, mit sowas wie Config::DB::DSN an eine Datenbankverbindung ranzugehen. Das ist aus Sicht der Verwendung ja auch nichts anderes als eine globale Variable. Auch wenn es technisch was völlig anderes ist.
 
Schumiel schrieb:
ich möchte gern eine Methode in einer anderen Klasse von meiner Klasse hinzufügen.
Wenn Du mit einer eigenen Klassenstruktur arbeitest und Methoden hast, die in mehreren Klassen vorkommen soll die aber nicht durch Ableitungen miteinander "verbunden" sind, dann ist da das Mittel der Wahl diese in Interfaces zu packen und dann die Klassen die die Methode benutzen sollen die Interfaces implementieren (class MyClass implements MyInterface) zu lassen.

uburoi schrieb:
Eine Klasse mit so etwas wie "Code-Injection" zu erweitern, ist zumindest bei den Sprachen, mit denen ich ich arbeite, meines Wissens nicht möglich (und würde m.E. auch dem Prinzip der Kapselung widersprechen).
Es gibt aber Sprachen, da ist es möglich und auch gewollt. Beispielhaft sei hier mal Common Lisp (CLOS) oder auch Dylan genannt. Dort gibt es das Konzept der Multimethoden:
https://de.wikipedia.org/wiki/Multimethode

RalphS schrieb:
Aber konkret globale Variablen sollte man IMO immer meiden und wenn man OO nutzt,
Ja. Man sollte da wirklich aufpassen. Denn das Problem der globalen Variablen handelt man sich auch bei OOP schnell ein, selbst wenn man echte globale Variablen meidet.
Denn Objekt-Attribute (Felder) sind ja letztlich nix anderes als Klassen-globale Variablen. Insbesondere, wenn man dann noch Monsterobjekte baut hat man dann schnell wieder das Problem der globals von früher. :-)
 
Zurück
Oben