2011-07-10 19 views
6

fare un esempio forzato dove voglio chiamare un metodo protected static da un altro contesto attraverso una funzione di callback:Utilizzo di "self" in un callback anonimo?

class Foo { 

    protected static function toBeCalled() { } 

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

} 

Questo è possibile in PHP 5.3? Non sono riuscito a trovare un modo per farlo funzionare ...

+0

Hai provato a passarlo come qualsiasi altra variabile esterna con 'use'? 'function() usa (& self) {...}' potrebbe essere necessario associarlo a un'altra variabile piuttosto che usare la parola chiave. – Orbling

+0

@Orbling Questo è il problema, è una * parola chiave *, non una variabile. Se è usato in una forma diversa da 'self :: methodName' è riconosciuto come costante. (Vai PHP! (ー _ ー ;;)) – deceze

+0

La mia comprensione è che le funzioni anonime hanno il loro scopo e non hanno accesso a nulla al di fuori tranne tramite l'uso. Tuttavia, sulla [documentazione] (http://php.net/manual/en/functions.anonymous.php), si dice che dalla v5.4.0 + '$ this' ora funziona all'interno di una chiusura, quindi forse' self' fa anche su quella versione. – Orbling

risposta

8

It's not possible, ma sarà in 5.4 insieme al supporto per $this in una chiusura.

Aggiunto chiusura $ questo supporto indietro. (Stas)

Reference

Modifica

Questo funziona in 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

Sapevo di "$ this", ma non sembra sicuro che funzionerà per "self". Vedremo, immagino. – deceze

+0

@deceze Le chiusure non hanno alcuna comprensione del contesto in cui sono state create. Quindi 'self',' static' e '$ this' non hanno significato. Questa consapevolezza del "contesto" viene aggiunta a 5.4. Anche se penso che sarebbe stato abbastanza facile implementare 'self', credo che lo abbiano rimosso per coerenza (dal momento che il supporto $ this non era previsto per 5.3). –

+0

Se non fosse una tale sofferenza installerei 5.4 e provalo ... ;-) Comunque, grazie per aver confermato che non è possibile al momento. – deceze

Problemi correlati