Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Methoden zu einer Klasse hinzufügen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Methoden zu einer Klasse hinzufügen

    Hallo,
    ich suche eine Möglichkeit (mit PHP 5.3.x) Methoden nachträglich zu einer Klasse hinzufügen, ohne dass ich am Code der Klasse schrauben muss (und wenn es so nicht geht, dann will ich so wenig wie möglich ändern).

    Also meine Idee war folgende:
    PHP-Code:
    class emptyClass{}
    $class = new emptyClass();

    $class->test = function (){
      echo 
    'hallo';
    };

    $test $class->test(); //Fails 
    Funktioniert aber nicht, und ich weiß auch warum, da diese anonymen Funktionen Objekte sind, die __invoke benutzen. Nun sieht PHP aber nach einer Methode und versucht nicht eine Eigenschaft mitteils __invoke auszuführen.

    Kennt jemand eine Idee wie man das umgehen kann ?
    Eine Idee wäre __call zu benutzen und dann zu sehen ob es eine Eigenschaft mit dem Namen gibt die eine anynyme Funktion ist, und wenn ja diese auszuführen.

    Grüße
    Signatur:
    PHP-Code:
    $s '0048656c6c6f20576f726c64';
    while(
    $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"


  • #2
    Kennt jemand eine Idee wie man das umgehen kann ?
    Ja, Du.
    Eine Idee wäre __call zu benutzen und dann zu sehen ob es eine Eigenschaft mit dem Namen gibt die eine anynyme Funktion ist, und wenn ja diese auszuführen.
    Das richtige Stichwort ist hier Callback. Ob das ne anonyme Funktion ist, ist unwichtig.

    Du kannst auch bspw. ein Objekt injecten und dessen Methoden als Action nutzern

    ungetestestet.
    PHP-Code:
    class foo
      
    {
      function 
    registerActions (bar $bar)
        {
        foreach (
    $bar->getActions as $name => $action)
          {
          
    $this->actions[$name] = array ($bar $action);
          }
        }

      function 
    __call ($method $params)
        {
        if (! isset (
    $this->actions[$method])) return;

        return (
    call_user_func_array ($this->actions[$method] , $params));
        }
      }

    interface 
    bar 
      
    {
      function 
    getActions ();
      }

    class 
    barbar implements bar
      
    {
      function 
    getActions ()
        {
        return (
               array (
                     
    'muh'  => 'actionMuh'  ,
                     
    'maeh' => 'actionMaeh' ,
                     )
               );
        }


      function 
    actionMuh()
        {
        }


      function 
    actionMaeh ()
        {
        }
      } 
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Naja, ich hab gedacht vllt, gibts einen tollen Trick wie man das ohne den __call Code machen kann ^^
      Aber dann werd ichs wohl so machen.

      Einziges Problem ist dann, dass man vorhandene Methoden nicht überschreiben kann, aber dafür ist das ganz auch nicht gedacht.
      Signatur:
      PHP-Code:
      $s '0048656c6c6f20576f726c64';
      while(
      $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

      Kommentar


      • #4
        Siehe edit.

        Einziges Problem ist dann, dass man vorhandene Methoden nicht überschreiben kann, aber dafür ist das ganz auch nicht gedacht.
        Naja, dann musst Du eben alle Methoden dynamisch implementieren.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar

        Lädt...
        X