2011-07-10 3 views
6

Weź contrived przykład, w którym chcę wezwać protected static metodę z innym kontekście przez funkcję zwrotną:Używanie "ja" w anonimowym oddzwonieniu?

class Foo { 

    protected static function toBeCalled() { } 

    public static function bar() { 
     functionThatAcceptsACallback(function() { 
      self::toBeCalled(); 
     }); 
    } 

} 

Jest to możliwe w PHP 5.3? Nie mogłem znaleźć sposobu, aby to zadziałało ...

+0

Czy próbowałeś przekazać go jak każdą inną zmienną zewnętrzną z 'use'? 'function() use (& self) {...}' może być konieczne powiązanie go z inną zmienną zamiast używania słowa kluczowego. – Orbling

+0

@Orbling To jest problem, to słowo kluczowe *, a nie zmienna. Jeśli jest używana w innej formie niż 'self :: methodName', jest rozpoznawana jako stała. (Idź PHP! (ー _ ー ;;)) – deceze

+0

Rozumiem, że anonimowe funkcje mają swój własny zakres i nie mają dostępu do niczego na zewnątrz, z wyjątkiem użycia. Jednak w [dokumentacji] (http://php.net/manual/en/functions.anonymous.php), mówi, że od wersji 5.4.0 + '$ this' działa teraz w zamknięciu, więc może' self' robi także w tej wersji. – Orbling

Odpowiedz

8

It's not possible, ale będzie w wersji 5.4 wraz z obsługą $this w zamknięciu.

Dodano zamknięcie tego wsparcia z powrotem. (Stach)

Reference

Edit

Działa to w 5.4alpha1.

class A 
    { 

     private function y() 
     { 
      print "y".PHP_EOL; 
     } 

     static private function z() 
     { 
      print "z".PHP_EOL; 
     } 

     function x() 
     { 
      return function() { 
       $this->y(); 
       self::z(); 
      }; 
     } 

    } 

    $class = new A(); 

    $closure = $class->x(); 

    $closure(); 

    /* 
    Output: 
    y 
    z 
    */ 
+0

Wiedziałem o '$ this', ale nie wydaje się pewne, że to zadziała dla' self'. Zobaczymy, chyba. – deceze

+0

@deceze Closures nie rozumieją kontekstu, w którym są tworzone. Więc 'self',' static' i '$ this' są bez znaczenia. Ta świadomość "kontekstu" jest dodawana do 5.4. Chociaż myślę, że wdrożenie "self" byłoby dość łatwe, uważam, że usunęli je dla spójności (ponieważ wsparcie "$ this" nie było planowane na 5.3). –

+0

Gdyby nie taki ból, zainstalowałbym 5.4 i spróbuję ... ;-) W każdym razie dziękuję za potwierdzenie, że nie jest to możliwe od teraz. – deceze