PHP's Closure (Closure) is also an anonymous function. was introduced by PHP5.3.

Source: Internet
Author: User

PHP's Closure (Closure) is also an anonymous function. was introduced by PHP5.3.

The syntax of a closure is simple, and the key word to be aware of is that only use,use means connecting closures and external variables.

123 $a= function() use($b) {}
Several functions of closures: 1 reducing the Loop code for foreach

such as the example cart in the handbook http://php.net/manual/en/functions.anonymous.php

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 <?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";// The result is 54.29?>

Here, if we transform the Gettotal function, we must use the foreach

2 Reducing the parameters of a function
12345678910111213141516 function html ($code , $id="", $class=""){if ($id !== "") $id = " id = \"$id\"" ;$class = ($class !== "")? " class =\"$class\"":">";$open = "<$code$id$class";$close = "</$code>";return function ($inner = "") use ($open, $close){return "$open$inner$close";};}如果是使用平时的方法,我们会把inner放到html函数参数中,这样不管是代码阅读还是使用都不如使用闭包
3 Lifting the recursive function
12345678910 <?php    $fib = function($n) use(&$fib) {        if($n == 0 || $n == 1) return 1;        return $fib($n - 1) + $fib($n - 2);    };   echo $fib(2) . "\n"; // 2   $lie = $fib;   $fib = function(){die(‘error‘);};//rewrite $fib variable    echo $lie(5); // error   because $fib is referenced by closure

Note that the use of the &amp in the above title is not used & error will occurFIb(

n-1) is unable to find function (the type of FIB is not previously defined)

So when you want to use closures to remove the loop function, you need to use the

1234 <?php$recursive= function () use(&$recursive){// The function is now available as $recursive}

Such a form

4 About delay binding

If you need to delay the binding of a variable inside a use, you need a reference, or you will make a copy of it when you define it.

1234567891011121314151617 <?php$result = 0; $one = function(){ var_dump($result); };$two = function() use ($result){ var_dump($result); }; $three = function() use (&$result){ var_dump($result); };$result++;$one();    // outputs NULL: $result is not in scope$two();    // outputs int(0): $result was copied$three();    // outputs int(1)

The use of references and non-use of references represents the assignment of a call, or the assignment of a value at the time of declaration

PHP's Closure (Closure) is also an anonymous function. was introduced by PHP5.3.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.