Rolf B: Instanz um Methoden errweitern

Beitrag lesen

Hallo pl,

gehts mir nur darum...

Lass es mich anders formulieren: ICH WILL ABER. Ja gut. Kann ich ja verstehen. Man macht sich einen Plan und hört dann nicht gerne, dass das keine gute Idee ist.

Habe gerade noch die runkit-Erweiterung gefunden (findest Du im PHP Handbuch), aber ich würde das nicht tun. Diese Erweiterung scheint auch nicht unbedingt gut mit PHP 7 zu funktionieren.

Mit einem einfachen include ist es aber trotzdem nicht getan. Das ist im Konzept von PHP so nicht vorgesehen. Mal eben eine Methode an ein Objekt - oder schlimmer noch, an eine Klasse - zu schrauben, ist eine gefährliche Sache. Das Laufzeitverhalten kann dadurch völlig unvorhersehbar werden, vor allem wenn Vererbung ins Spiel kommt.

Was Du da haben willst, ist selbstmodifizierender Code, und das ist einer der brisantesten Footguns, seit Johnny Neumann Code und Daten in einen Speicher legte.

Siehst Du denn einen gravierenden Vorteil darin, den Mailer als Methode an die aktuelle Klasse zu schrauben, statt einfach ein Objekt einer Workerklasse zu erzeugen? Ich sehe es eher als nachteilig. Das Anschrauben der Methode bedeutet, diese Methode nachher in mehreren Klassen des Systems herumfliegen zu haben.

Wobei die Mailfunktion in eine Datei ausgelagert gehört, damit sie auch von Instanzen anderer Klassen genutzt werden kann

Genau das ist das Signalwort für: Eigene Klasse!

Den Worker mit require_once zu holen bedeutet, die Implementierung genau einmal zu laden und dann nur noch von überall, wo sie gebraucht wird, zu verwenden. Es ist nur eine Codezeile mehr: $mailer = new Mailer();

Wenn es deine Absicht ist, dass der Mailer Methoden oder Eigenschaften der Klasse nutzt, in die er hinein geladen wird, dann warne ich erneut. Auch das führt in den OOS[1]-Abgrund. Wenn der Mailer Daten braucht, musst Du ihn damit versorgen. Er sollte sie sich nicht implizit selbst holen.

Eine halbwegs transparente Version des "selbst holens" kannst du mit Interfaces erreichen. Der Mailer bekommt beim new ein Objekt übergeben, das ein bestimmtes Interface implementiert. Über dieses Interface kann der Mailer seine Daten abrufen, und er kann mit $dataprovider instanceof IMailerDataProvider auch sicherstellen, dass in $dataprovider eine Implementierung dieses Interfaces geliefert wird.

Wenn Du einfach eine Methode mail bereitstellen musst, weil ein anderes Codestück das erwartet und du die Funktionsprinzipiien deines Perl-Frameworks möglichst unverändert abbilden willst, dann könntest Du die Methode in einer Basisklasse bereitstellen. Die Implementierung kann trotzdem in der Mailerklasse liegen: das bereitgestellte mail() ist lediglich ein Durchlauferhitzer, holt den Mailer mit require_once herein, instanziiert ihn und ruft ihn auf.

Rolf

--
sumpsi - posui - clusi

  1. Objekt-Orientiertes Spaghetti ↩︎

0 53

Instanz um Methoden errweitern

pl
  • php
  1. 0
    Tabellenkalk
    1. 0
      pl
  2. 1
    1unitedpower
    1. 0
      pl
      1. 0
        1unitedpower
        1. 0
          Rolf B
          1. 0
            1unitedpower
            1. 0
              Rolf B
              1. 0
                pl
        2. 0
          pl
          1. 0
            1unitedpower
            1. 0
              Matthias Apsel
            2. 0
              pl
              1. 0
                1unitedpower
                1. 0
                  pl
                  1. 2
                    1unitedpower
              2. 0
                pl
                1. 0
                  1unitedpower
            3. 0
              Der Martin
              1. 1
                Christian Kruse
                1. 0
                  pl
                  1. 0
                    Christian Kruse
                2. 0
                  Rolf B
                  1. 0
                    Christian Kruse
                    1. 0
                      Rolf B
                      1. 0
                        Christian Kruse
                        1. 0
                          1unitedpower
                      2. 0
                        1unitedpower
                        1. 0
                          Christian Kruse
                          1. 0
                            1unitedpower
                            1. 0
                              Christian Kruse
                              • elixir
                  2. 0
                    pl
                    1. 0
                      Christian Kruse
                    2. 0
                      pl
                      1. 0
                        Matthias Apsel
              2. 0
                pl
              3. 0
                1unitedpower
              4. 0
                pl
                1. 1
                  Rolf B
                  1. 0
                    pl
                  2. 0
                    pl
  3. 0
    Rolf B
    1. 0
      pl
      1. 2
        Rolf B
        1. -2
          pl
          1. 0
            Christian Kruse
          2. 0
            pl
            • perl
            • php
  4. 0
    pl
    1. 0
      Rolf B
      1. 0
        pl
        1. 0
          Mitleser
      2. 0
        pl