Heim  >  Artikel  >  Backend-Entwicklung  >  PHP闭包

PHP闭包

WBOY
WBOYOriginal
2016-06-20 12:29:321035Durchsuche

 PHP5.3以后, PHP 增加了匿名函数

匿名函数(Anonymous function),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。经常用作回调函数(callback)参数的值。当然,也有其他应用的情况。

匿名函数示例

<?php/**  *preg_replace_callback执行一个正则表达式搜索并且使用一个回调进行替换  *其他同preg_replace*/echo preg_replace_callback('~-([a-z])~', function ($match) {    return strtoupper($match[1]);}, 'hello-world');// 输出 helloWorld?>

匿名函数变量赋值

闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 Closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号。

闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号

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

从父作用域继承变量

闭包可以从父作用域中继承变量。任何此类变量都应该用 use 语言结构传递进去。

<?php$message = 'hello';// 没有 "use"$example = function () {    var_dump($message);};echo $example();// 继承 $message$example = function () use ($message) {    var_dump($message);};echo $example();// Inherited variable's value is from when the function// is defined, not when called$message = 'world';echo $example();// Reset message$message = 'hello';// Inherit by-reference$example = function () use (&$message) {    var_dump($message);};echo $example();// The changed value in the parent scope// is reflected inside the function call$message = 'world';echo $example();// Closures can also accept regular arguments$example = function ($arg) use ($message) {    var_dump($arg . ' ' . $message);};$example("hello");?>



Closure和作用域

<?php// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。// 其中有一个方法用来计算购物车中所有商品的总价格,该方法使// 用了一个 closure 作为回调函数。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;// 往购物车里添加条目$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?>





Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn