Sitio web no optimizado para IE 6

Closures En Php 5.3

posteado por Emiliano, categoría Php

16 abr
2010

PHP 5.3 viene con muchas nuevas y útiles características, y en este post hablaremos sobre una de ellas.

Como vamos descubriendo la versión 5.3 de PHP viene con nuevas y muy útiles características, una de ellas son las funciones anónimas.

Las funciones anónimas, también conocidas como closures, nos dan la posibilidad de crear funciones a las cuales no le definimos su nombre. Esta característica tiene muchos usos, pero se utiliza comunmente como el valor de los parametros de callbacks.

<?php  echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');
// outputs helloWorld
?>

Además, los closures pueden ser usados como valores de las variables, es decir, PHP automáticamente convierte estas expresiones en instancias de la clase interna Closure. Para asignar un closure a una variable se utiliza la misma sintaxis que e cualquier otra asignación:

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

$greet('World');
$greet('PHP');
?>

Closures además pueden heredar variables desde clases padres, estas variables deben ser declaradas en la función header. Hay que tener en cuenta que heredar variables desde el padre no es lo mismo que utilizar variables globales. Las variables globales existen en un ambiernte global, para lo cual no importa que función se esta utilizando. El alcance de un closure es la función en la cual el closure fué declarado (no necesariamente la función que invoca el closure). Veamos el siguiente ejemplo:

<?php  // Un carrito de compras el cual contiene una lista de los productos agregados
// y la cantidad de cada producto. Incluimos un metodo en el cual
// calculamos el total del precio de los items en el carrito usando un
// closure como un callback.

class Cart
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;

protected $products = array();

public function add($product, $quantity)
{
$this->products[$product] = $quantity;
}

public function getQuantity($product)
{
return isset($this->products[$product]) ? $this->products[$product] :
FALSE;
}

public function getTotal($tax)
{
$total = 0.00;

$callback =
function ($quantity, $product) use ($tax, &$total)
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};

array_walk($this->products, $callback);
return round($total, 2);
}
}

$my_cart = new Cart;

// Agregamos algunos items al carrito
$my_cart->add('manteca', 1);
$my_cart->add('leche', 3);
$my_cart->add('huevos', 6);

// Imprime el total con un 5% de impuestos.
print $my_cart->getTotal(0.05) . "\n";
// El resultado es 54.29
?>

Debemos recordar que las funciones anónimas (closures) están disponibles desde PHP 5.3. Las funciones anónimas son implementadas usando la clase Closure.

 

Fuente: php.net

Compártelo: technorati Closures En Php 5.3 digg Closures En Php 5.3 facebook Closures En Php 5.3 google Closures En Php 5.3 linkedin Closures En Php 5.3

4 Comentarios:


Dario:

21 de Abril de 2010 a las 01:31:43

Muy buen post; Algo nuevo en la programacion orientada a objetos(nuevo para mi)..... a lo que yo entendi es que cuando asignamos una función closure a una variable, esta puede que se ejecute o no, ya que esta funcionando como anonima...pero...sinceramente no ecuentro la ventaja en la utilizacion de esta función... ......un abrazoo......

zokra:

27 de Mayo de 2010 a las 04:22:50

Yo tampoco entiendo la ventaja, realmente... alguien puede explicarme que diferencia hay con la forma tradicional? o simplemente es mas cool, moderno y geek decirle a algun colega "Hey, yo uso closures ya, vos?". Digo, es parte de no quedar "out" o realmente sirve de algo?

David:

28 de Enero de 2011 a las 09:57:51

Bueno, en realidad no le veo demasiada funcionalidad. Tal vez, la única, sea que para una función que no requiera un uso global en toda la aplicación y para un momento puntual puedes emplearlo. Aunque el uso de las funciones anónimas en código provoca un mal diseño de la aplicación y problemas de lectura. Por cierto, a la hora de escribir código, creo que tardas el mismo tiempo. Yo prefiero utilizar clases con métodos mágicos como __invoke(). Por lo demás magnifico artículo sobre los closures. Felicidades.

Ymic:

26 de Agosto de 2011 a las 16:06:52

Hay blog que no dan valor agregado y normalmente son copy paste de otro lado...cuál es la gracia?

Comentar este Artículo






Captcha ImageReload_original