2012-02-25 7 views
9

¿Es posible acceder a las clases/objetos mencionados como self, static y $this en devoluciones de llamada anónimas en PHP? Al igual que este:

class Foo { 
    const BAZ = 5; 
    public static function bar() { 
     echo self::BAZ; // it works OK 
     array_filter(array(1,3,5), function($number) /* use(self) */ { 
      return $number !== self::BAZ; // I cannot access self from here 
     }); 
    } 
} 

¿Hay alguna manera de hacer que se comporte como con variables habituales, utilizando use(self) cláusula?

+1

Desde PHP 5.4, es posible usar $ this. –

+0

* (relacionado) * [PHP 5.4 - 'cierre $ this support'] (http://stackoverflow.com/questions/5734011/php-5-4-closure-this-support/5734109#5734109) – Gordon

Respuesta

13

Con PHP5.4 será. Por ahora no es posible. Sin embargo, si sólo se necesita el acceso a las propiedades públicas, el método

$that = $this; 
function() use ($that) { echo $that->doSomething(); } 

Para constantes no hay ninguna razón para no el nombre calificado

function() { echo Classname::FOO; } 
+1

Gracias por la responder. Sin embargo, no es posible utilizar Classname si necesito sustituir static :: FOO, es decir, enlace tardío. –

+1

Suena que está buscando más propiedades de clase (también conocidas como propiedades estáticas) que constantes. Sin embargo, con el primer ejemplo en mi respuesta, deberías poder llamar a la constante como '$ that :: FOO'. – KingCrunch

+0

En realidad, creo que para hacer lo que el OP quiere con el enlace tardío no sería: $ that = static :: FOO; –

4

sólo tiene que utilizar la forma estándar:

Foo::BAZ; 

o

$baz = self::BAZ; 
... function($number) use($baz) { 
    $baz; 
} 
0

Qué tal esto:

class Foo { 
    const BAZ = 5; 
    $self = __class__; 
    public static function bar() { 
     echo self::BAZ; // it works OK 
     array_filter(array(1,3,5), function($number) use($self) { 
      return $number !== $self::BAZ; // access to self, just your const must be public 
     }); 
    } 
} 
Cuestiones relacionadas