Новое в PHP 5.3: замыкания (лямбда-функции)
Замыкания (closures, лямбда-функции, анонимные функции) есть функция, не привязанная к конкретному имени функции.
Их удобно использовать в качестве callback-параметра в функциях.
Пример1
1 2 3 4 5 6 |
<?php echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // вывод: helloWorld ?> |
Замыкание может быть значением переменной. В таком случае переменная становится экземпляром встроенного класса Closure («замыкание»). Присваивание значения при этом ничем не отличается от обычного присваивания значения (включая и точку с запятой в конце).
Пример2
1 2 3 4 5 6 7 8 9 |
<?php $greet = function($name) { printf("Hello %s\r\n", $name); }; $greet('World');// вывод: hello World $greet('PHP');// вывод: hello PHP ?> |
Замыкания имеют доступ к переменным из родительского контекста. Для этого такая переменная должна быть объявлена в заголовке анонимной функции с использованием ключевого слова use. Это не то же самое, что и глобальные переменные. Глобальные переменные объявлены в глобальном контексте, который не меняется в зависимости от вызванной функции. Родительский контекст для замыкания ограничен функцией, в которой замыкание объявлено (но не функцией, вызвавшей его).
Пример3. Контексты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?php // Простая продовольственная корзина, содержащая список продуктов // и количество каждого. Включает метод подсчёта общей // стоимости товаров в корзине с использованием // замыкания в качестве 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) { //тут надо бы использовать defined() $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; // Добавим несколько продуктов в корзину $my_cart->add('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 6); // Выведем общую стоимость с учётом 5% налога с продаж. print $my_cart->getTotal(0.05) . "\n"; // вывод: 54.29 ?> |
Внутри замыканий можно использовать функции func_num_args(), func_get_arg() и func_get_args().
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.