2012-07-21 15 views
5

Estoy tratando de entender acerca de la clase de clausura, en el manual existe, Todo en el manual de Link,PHP, La clase de cierre

Cierre :: __ construct - Constructor que no permite la instanciación. Si lo entiendo bien, la única instancia de esta clase es para la asignación de variables de funciones anónimas.

Pero yo no entendía pocas líneas:

Cierre :: bind - Duplica un cierre con un objeto y alcance de clase consolidado específico.

Closure :: bindTo - Duplica el cierre con un nuevo objeto enlazado y un alcance de clase.

Y el último en el manual no entendía esta frase:

Además de los métodos enumerados aquí, esta clase también tiene un método __invoke. Esto es por coherencia con otras clases que implementan magia , ya que este método no se usa para llamar a la función.

Si alguien puede por favor tratar de explicarme estas líneas, estaré muy agradecido, tenga un buen día.

+0

Gracias a todos, estoy leyendo las respuestas ahora. –

Respuesta

7

Se refiere al calling magic.

Según tengo entendido, para cualquier clase que contenga el método __invoke que se puede llamar a sus instancias como si fuera una función. El Closure::__invoke actúa así.

es decir, cuando $foo es de la clase Closure (función anónima), llamando $foo($bar) llamará $foo->__invoke(bar) (aunque el miembro __invoke no está destinado a ser llamado directamente, esto es sólo para mostrar cómo funciona).

Al definir funciones anónimas, esto se hace:

$greet = function($name) 
{ 
    printf("Hello %s\r\n", $name); 
}; 

Ahora, $greet es de la clase Closure. y $greet->__invoke es algo así como function($name){ printf("Hello %s\r\n", $name); }

Y recuerde, Closure::__invoke es un Magic Method.

+0

Gracias Alvin Wong por su explicación sobre el Método Mágico __invoke. También sé ahora sobre otro método mágico que puedo usar en OOP así que gracias y que tenga un buen día. –

3

Creo que la diferencia entre bind y bindTo es sólo en la forma en que se llaman:

$cl->bindTo($obj) 

es equivalente a

Closure::bind($cl, $obj) 

En cuanto a la __invoke meethod, es decir que existe el método , pero en realidad no se usa. Cuando utiliza el cierre como una función, se usa un mecanismo interno (probablemente más eficiente) que puentea el método. Pero el método está ahí para la compatibilidad con otras clases que son invocables, y puede llamarlo manualmente si así lo desea.

+0

Gracias, Barmar, por favor amplía un poco más acerca de bind y bindTo porque no sé si lo hice bien si puedes comparar bindTo y enlazar a un código, por favor. –

+0

como [este] (http://www.php.net/manual/en/closure.bind.php) indica que 'Este método es una versión estática de Closure :: bindTo().' –

+0

Mire los ejemplos en la documentación. No creo que pueda hacer nada mejor que eso. Son solo dos formas diferentes de escribir exactamente lo mismo: bindTo está orientado a objetos, mientras que bind es un estilo de función tradicional. – Barmar