Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Lambda-Funktion als Property eines Objektes

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

  • [Erledigt] Lambda-Funktion als Property eines Objektes

    Ich hätte mal eine Frage, ist es möglich eine Lambda Fuktion als Eigenschaft eines Objectes zu zuweisen?

    Ich hatte es auf folgende Weise versucht.

    PHP-Code:
    class Foo {
        protected 
    $Handler NULL;

        public function 
    register ($callback)
        {
            
    $this->Handler $callback;
        }

        public function 
    execute()
        {
                
    $this->Handler();
        }
    }

    $bar = new Foo;
    $bar->register(
        function ()
        {
                echo 
    'test';
        }
    );
    $bar->execute(); 
    In der Versuch bekomme ich
    Fatal error: Call to undefined method Foo::Handler() in ....

    Gehe ich es einfach nur Falsch an, oder ist das gar nicht möglich?
    signatur was ist das denn,
    davon hab ich noch nie gehört


  • #2
    PHP-Code:
    class Foo {
        protected static 
    $Handler NULL;

        public function 
    register ($callback)
        {
            
    self::$Handler $callback;
        }

        public function 
    execute()
        {
                
    self::$Handler();
        }
    }

    $bar = new Foo;
    $bar->register(
        function ()
        {
                echo 
    'test';
        }
    );
    $bar->execute(); 
    Versuchs mal so ( weiß es selbst nicht genau, habe ich noch nie getestet )
    "Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]

    Kommentar


    • #3
      Direkt ausprobiert ....

      Fatal error: Function name must be a string in ...

      hmm.
      signatur was ist das denn,
      davon hab ich noch nie gehört

      Kommentar


      • #4
        Glaub nicht, dass das nen Unterschied macht. Entschiedender ist, ob php5.3 verwendet wird. Ansonsten würde ich eher auch call_user_func und einen Stringparameter setzen.
        --

        „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


        • #5
          also ich nutze php 5.3.1
          signatur was ist das denn,
          davon hab ich noch nie gehört

          Kommentar


          • #6
            Der Aufruf ist wohl falsch. Hier das Beispiel von php.net:
            PHP-Code:
            $container = new DIContainer();
             
            // gekürzt 

            $container->user = function ($c)
            {
              return new 
            User($c->storage);
            };
             
            // beachte den Aufruf
            $user $container->user
            [edit]
            Nicht php.net sondern http://fabien.potencier.org/article/...s-and-closures
            --

            „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


            • #7
              PHP-Code:
              class Foo {
                  protected 
              $Handler NULL;

                  public function 
              register ($callback)
                  {
                      
              $this->Handler $callback;
                  }

                  public function 
              execute()
                  {
                          
              $test $this->Handler();
                          
              $test(); //Das funktioniert
                  
              }
              }

              $bar = new Foo;
              $bar->register(
                  function ()
                  {
                          echo 
              'test';
                  }
              );
              $bar->execute(); 
              So funktioniert das.
              Nur warum funktioniert das den nicht direkt?
              signatur was ist das denn,
              davon hab ich noch nie gehört

              Kommentar


              • #8
                Vermutlich da im Context einer Instanz immer nach einer Methode gesucht wird, Closures sind dafür nicht gedacht.

                PHP-Code:
                    class Foo {
                        protected 
                $Handler NULL;
                    
                        public function 
                register (Closure $callback)
                        {
                            
                $this->Handler $callback;
                        }
                    
                        public function 
                execute()
                        {
                                
                $this->Handler();
                        }
                        
                        public function 
                Handler()
                        {
                            print 
                'dieser test lüppt';
                        }
                    } 
                PHP-Code:
                public function execute()
                {
                    
                $this->Handler();

                Stattdessen bietet sich folgende Alternative an

                PHP-Code:
                public function execute()
                {
                    
                $this->Handler->__invoke();

                Falls die Methode register nur Closures annehmen soll, bietet sich auch ein passender Typehint an

                PHP-Code:
                public function register (Closure $callback
                DevBlog|3D Online-Shopping|Xatrium

                Kommentar


                • #9
                  Es hängt also alles damit zusammen das Closures selbst Objecte der Closure Klasse sind?
                  Also mit __invoke() klappt das bei Closures aber gibt es denn eine möglichkeit, das grundsätzlich auch unabhängig zu machen, ob es nun Closures sind oder einfach Funktionsnamen.

                  Ist der einzigste weg wirklich über eine locale Variable, der man den Handle zuweist?

                  PHP-Code:
                  class Foo
                  {
                      protected 
                  $Handler NULL;
                      
                      public function 
                  register ($callback)
                      {
                          
                  $this->Handler $callback;
                      }
                      
                      public function 
                  execute ()
                      {
                          
                  $handler $this->Handler;
                          
                  $handler();
                      }
                  }

                  $test1 = new Foo;
                  $test1->register(
                      function ()
                      {
                          echo 
                  'Closure';
                      }
                  )
                  $test1->execute();


                  function 
                  mitName ()
                  {
                      echo 
                  'Mit Namen';
                  }

                  $test2 = new Foo;
                  $test2->register('mitName');
                  $test2->execute(); 
                  Das oben funtioniert so, aber irgendwie hatte ich gehofft,
                  die lokale Varible zu sparen.
                  signatur was ist das denn,
                  davon hab ich noch nie gehört

                  Kommentar


                  • #10
                    Ja, Closures sind lediglich Instanzen der finalen Klasse Closure.

                    Ich kenne nun nicht die genauen Anforderungen deines Konstrukts. Du kannst noch mit einer Bedingung arbeiten, denke da wirst du nicht drum rum kommen da die anonymen Funktionen ganz anders konzipiert sind als Closures.

                    PHP-Code:
                    public function execute ()
                    {
                        if(
                    $this->Handler instanceof Closure)
                        {
                            return 
                    $this->Handler->__invoke();
                               }
                               return 
                    call_user_func($this->Handler);

                    Dein Code oben funktioniert so nicht, es fehlt ein ;
                    DevBlog|3D Online-Shopping|Xatrium

                    Kommentar


                    • #11
                      Alternative wäre __call
                      www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
                      Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih

                      Kommentar


                      • #12
                        Zitat von Tiberius Beitrag anzeigen
                        Dein Code oben funktioniert so nicht, es fehlt ein ;
                        jup bei schnellen erstellen von beispiel code mal wieder das ; vergessen
                        ich denke mal ich habe gute funktionierende beispiele von euch bekommen
                        werde das thema mal auf erledigt setzen
                        signatur was ist das denn,
                        davon hab ich noch nie gehört

                        Kommentar

                        Lädt...
                        X