源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

php的闭包(Closure)匿名函数详解

  • 时间:2020-11-06 14:46 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:php的闭包(Closure)匿名函数详解
php的闭包(Closure)也就是匿名函数,是PHP5.3引入的。 闭包的语法很简单,需要注意的关键字就只有use,use是连接闭包和外界变量。
[url=http://php.net/manual/en/functions.anonymous.php]http://php.net/manual/en/functions.anonymous.php[/url] 中的例子Cart
[u]复制代码[/u] 代码如下:
<?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 ?>
这里如果我们改造getTotal函数必然要使用到foreach。 [b]2. 减少函数的参数[/b]
[u]复制代码[/u] 代码如下:
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函数参数中,这样不管是代码阅读还是使用都不如使用闭包。 [b]3. 解除递归函数[/b]
[u]复制代码[/u] 代码如下:
<?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
注意上题中的use使用了&,这里不使用&会出现错误fib(n-1)是找不到function的(前面没有定义fib的类型) 所以想使用闭包解除循环函数的时候就需要使用
[u]复制代码[/u] 代码如下:
<?php $recursive = function () use (&$recursive){ // The function is now available as $recursive }
这样的形式。 [b]4. 延迟绑定[/b] 如果你需要延迟绑定use里面的变量,你就需要使用引用,否则在定义的时候就会做一份拷贝放到use中
[u]复制代码[/u] 代码如下:
<?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)
使用引用和不使用引用就代表了是调用时赋值,还是申明时候赋值 小伙伴们是否对PHP的匿名函数也就是闭包函数有了新的认识了呢,希望本文能给大家一些提示,希望大家能够喜欢。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部