2011-07-10 30 views
6

tomar un ejemplo artificial donde quiero llamar a un método protected static de otro contexto a través de una función de devolución de llamada:¿Está utilizando 'self' en una devolución de llamada anónima?

class Foo { 

    protected static function toBeCalled() { } 

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

} 

Es esto posible en PHP 5.3? No he podido encontrar una manera de hacer que funcione ...

+0

Ha intentado pasar como cualquier otra variable externa con 'use'? 'function() use (& self) {...}' puede necesitar vincularlo a otra variable en lugar de usar la palabra clave. – Orbling

+0

@Orbling Ese es el problema, es una * palabra clave *, no una variable. Si se usa en cualquier forma que no sea 'self :: methodName', se reconoce como una constante. (Vaya PHP! (ー _ ー ;;)) – deceze

+0

Según tengo entendido, las funciones anónimas tienen su propio alcance y no tienen acceso a nada externo, excepto a través del uso. Sin embargo, en la [documentación] (http://php.net/manual/en/functions.anonymous.php), dice que a partir de v5.4.0 + '$ this' ahora funciona dentro de un cierre, por lo que tal vez' self' también lo hace en esa versión. – Orbling

Respuesta

8

It's not possible, pero será en 5.4 junto con soporte para $this en un cierre.

Cierre adicional $ this support back. (Stas)

Reference

Editar

Esto funciona en 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

Sabía de '$ this', pero no parece seguro que eso funcione para' self'. Veremos, supongo. – deceze

+0

@deceze Los cierres no entienden el contexto en el que se crean. Así que 'self',' static' y '$ this' no tienen sentido. Esta conciencia de "contexto" se está agregando a 5.4. Si bien creo que hubiera sido bastante fácil implementar 'self', creo que lo eliminaron por coherencia (ya que el soporte' $ this' no estaba previsto para 5.3). –

+0

Si no fuera tan doloroso, instalaría 5.4 y lo intentaría ... ;-) De todos modos, gracias por confirmar que no es posible a partir de ahora. – deceze

Cuestiones relacionadas