匿名函数
1.首先为名词解释,什么为匿名函数。很多时候概念是最饶人的。可以很直接的理解为,没有名字的函数。那匿名函数和常规函数的区别是什么,匿名函数是一个表达式,而非一个语句。
2.语法
function (){
//语句
};
tip:①语法很简单②后边有分号,也可以理解为一种语句。
3.举例更直观
function ($params){
echo $params;
}
闭包
1.闭包是指在创建时封装周围状态的函数,即便闭包所在的环境不存在了,闭包中封装的状态依然存在。概念还是非常的晦涩的。
2.语法
function () use(){
//语句
}
3.举例更直观
1.函数中封装闭包
function content()
{
$func = function($params){
echo $params;
};
$func('hello');
}
//调用
content();
//输出
hello
2.函数封装并返回
function content()
{
$func = function($params){
echo $params;
};
return $func;
}
//调用并输出
echo content()('hello');
//输出
hello
tip:上面的调用比较能说明问题,content()这种看似是平常的调用,当前作为一个匿名函数。所以后面按函数的语法,再加入括号和参数即可。
3.匿名函数当做参数传入
//定义普通函数
function content($func)
{
$func('hello');
}
//定义匿名函数
$func = function($params)
{
echo $params;
};
//调用
echo content($func);
//输出
hello
4.应用use关键字
function content($params)
{
//use关键字可以使用外部的数据
$func = function() use($params){
echo $params;
};
$func();
}
//调用
content('hello');
//输出
hello
tip:use关键字的功能和作用就是可以使用外部的数据。
实战应用
1.实战业务场景,当前自己在电商行业,就拿电商场景做说明。电商的购物车结算页面,需要支付的总值,不仅受本身商品价格的影响,还受到促销的影响。当前的逻辑为,知道了购物车的总价,需要减去商品促销,订单促销和优惠券。算出最终的实付金额。
2.实战代码
/应用
class promotion{
private $promotionData = [];
public function add(string $promotionType, int $discountPrice) :bool
{
return $this->promotionData[$promotionType] = $discountPrice;
}
public function getTotal($total)
{
//封装闭包当回调函数使用
$callFunc = function(int $discountPrice) use(&$total){
$total -= $discountPrice;
};
array_walk($this->promotionData, $callFunc);
//输出逻辑
echo $total;
}
}
$promotion = new promotion();
//商品促销
$promotion ->add('goodsPromotion',200);
//订单促销
$promotion ->add('tradePromotion',100);
//优惠券
$promotion ->add('couponPromotion',50);
//打印
print $promotion->getTotal(900) . "\n";
输出
550
tip:大家是不是看到循环的for或是foreach了,代码变得很简介了。上机多做练习,会有更深的映象。
网友评论