2010-08-31 7 views
17

Se utiliza un cierre php o función anónima para crear una función sin especificar su nombre.Creación e invocación de una función anónima en una sola instrucción

¿Es posible llamarlos sin asignar al identificador como lo hacemos en JavaScript? p.

(function(){ 
    echo('anonymous function'); 
})(); 

¿Cuál es el uso correcto de use construcción, mientras que la definición de función anónima y cuál es el estado de la función anónima en el método público con la accesibilidad a las propiedades privadas?

$anon_func = 
function($my_param) use($this->object_property){ //use of $this is erroneous here 
    echo('anonymous function'); 
}; 
+4

Un cierre no es totalmente sinónimo de una función anónima, aunque las funciones anónimas en PHP son de tipo 'Closure'. Solo para que sepas. – BoltClock

+0

¿Cuál es el error exacto cuando prueba su segundo ejemplo de código? 'erróneo' es un poco inespecífico. – BoltClock

+0

No se puede usar $ this como variable léxica –

Respuesta

11

¿Es posible llamar a ellos sin asignar a identificador como hacemos en JavaScript? p.ej.

No en PHP 5.x; a menos que cuentes cuando tu método tome una devolución de llamada como argumento. por ejemplo:

$square = array_map(function ($v) { return $v*$v; }, $array); 

¿Cuál es el uso correcto de uso construcción, mientras que la definición de función anónima

La palabra clave use indica que variables del ámbito léxico actual deben ser importados en el cierre. Incluso puede pasarlos por referencia y cambiar la variable que se pasa, por ejemplo:

$total = 0; 
array_walk($array, function ($v) use (&$total) { $total += $v; }); 
// $total is now the sum of elements in $array 

lo que es el estado de la función anónima en método público con accesibilidad a la propiedad privada?

cierres definidas dentro de una clase tienen acceso completo a todas sus propiedades y métodos, incluyendo las privadas sin necesidad de importar $this través de la palabra clave use en PHP 5.4:

// this works fine in PHP 5.4 
$anon_func = 
function($my_param) { 
    $thing = $my_param + $this->object_property; 
    echo('anonymous function'); 
}; 

Tenga en cuenta que por alguna extraña razón soporte para $this en los cierres was removed in PHP 5.3. En esta versión, se puede evitar esta restricción usando algo como:

// a workaround for PHP 5.3 
$temp = $this; 

$anon_func = 
function($my_param) use ($temp) { 
    $thing = $my_param + $temp->object_property; 
    echo('anonymous function'); 
}; 

Pero esto le da acceso a sólo los miembros públicos, intentar acceder a miembros privados todavía le dará un error.

También tenga en cuenta que al intentar importar $this (a través de use), independientemente de la versión de PHP, se producirá un error fatal Cannot use $this as lexical variable.

+3

+1 No es posible invocar automáticamente funciones anónimas como '(function() {})();' en PHP, probablemente por las mismas razones por las que la desreferenciación de matrices aún no es factible, como señala Marc B. – BoltClock

+0

@BoltClock BTW array dereferrencing (por ejemplo: 'function foo() {return $ someArray;}', '$ var = foo() ['bar']') también funciona en PHP 5.4 – NullUserException

3

no se parece a ella, ya que todavía tienen que ser declarada con la notación function() {}, y en mi 5.3.2 instalar, probar su noción de ejemplo devuelve un error de sintaxis unexpected '('. El doc page en cierres tampoco lo menciona.

Tal vez sea posible una vez que parcheen el analizador para permitir la desreferenciación de matrices somefunction()[2].

+1

La desreferenciación de matrices se ha agregado a [PHP 5.4] (http://www.php.net/manual/en/migration54.new-features.php), pero aún no puede llamar a las funciones anónimas inmediatamente después de su declaración. – NullUserException

19
call_user_func(function() use(closure-vars){ ... }); 
+0

¿Cómo haría el OP las propiedades de clase? accesible para el cierre? –

+0

La operación podría crear una referencia del objeto para pasar al cierre a través de la declaración de uso, es decir: $ obj = $ this; call_user_func (function() use ($ obj) {}). De esta forma, tendrá acceso a las propiedades y métodos de la clase dentro del cierre. Es un truco, pero es lo mejor que tenemos hasta que llega PHP 5.4. – Jeremy

15

PHP 7 agregó la capacidad de hacer esto.

este código:

(function() { echo "This works as expected in PHP 7.\n"; })(); 

obras, como cabría esperar en PHP 7. (Todavía no funciona en cualquier versión de PHP 5.x)

+0

Impresionante función. –

Cuestiones relacionadas