返回玩转匿名函数与......登陆

玩转匿名函数与闭包

2019-08-09 13:10:4552

<?php

/**

 * 教学内容: 什么是闭包?

 * 1. 提到闭包,就不得不提匿名函数,php官方手册中,将闭包与匿名函数视为等同的

 * 2. 闭包的三种使用场景: 函数内部, 函数参数, 函数返回值

 */


/**

 * 老师,昨晚讲的回调,觉得匿名函数真的很强大,有人说,匿名函数主要用在闭包中,那么闭包又是什么呢?

 * 闭包并不是php的专利,很多编程语言都有的,例如,javascript,当然,php中的闭包,还是很有特色的

 */



/**

 * @param $name

 * @return string

 */

$demo1 = function ($name) {

  return $name . '最爱的人是: 赵敏';

};


//调用匿名函数

echo $demo1('张无忌'), '<hr>';


//匿名函数也有自己的作用域,如果要在函数作用域中使用外部变量,除了传参,还可以这样


$belle = '周芷若';


//$demo2 = function ($name) {

$demo2 = function ($name) use ($belle) {

//    return $name . '最爱的人是赵敏';

    return $name . '最爱的人是: ' . $belle;

};


//调用匿名函数

echo $demo2('张无忌'), '<hr>';


//匿名函数可以使用use 关键字,访问参数列表之外的数据,而且这个数组可以来自匿名函数的外部,这个可太有意思了

//它可以实现非常多的实用功能,极大的增强了函数的功能


//现在,咱们来详细说说闭包的问题,理解了匿名函数,以及匿名函数中的use关键字的使用,闭包就非常简单了


//首先,我们先给闭包下一个简单的定义: 将匿名函数当作一个普通变量,在另一个函数中调用它,就会形成一个闭包,这时,匿名函数的功能,

//就是生成一个闭包,所以,现在把匿名函数,直接称为: 闭包函数, 也是没问题的。


//变量在函数中有三个作用:1. 当作局部变量  2.当作参数,其实还是局部变量  3. 当作返回值,基本质还是一个局部变量

//所以闭包也有三种使用场景:


//1.闭包函数当作局部变量使用

$func1 = function () {

    $name = '无忌哥哥';

    //定义一个内部的匿名函数

    $test = function () use ($name) {

        return $name . ',我另一个函数包住了,快来救我';

    };

    //调用,必须要调用一次,才能形成闭包

    return $test();

};


echo $func1(), '<hr>';


//2.闭包函数当作函数参数使用

$name = '无忌哥哥';


$test = function () use ($name) {

    return $name . ',我又被当作参数啦,你还要我吗?';

};


$func2 = function (callable $callback) {

    //执行匿名回调并返回

    return $callback();

};

//用匿名函数做为参数调用

echo $func2($test), '<hr>';


//3.闭包函数当用函数返回值使用

$func3 = function () {

    $name = '无忌哥哥';


    $test = function () use ($name) {

        return $name . ',我又被当作参数啦,真倒霉~~';

    };

    return $test;

};


//你可能见到最多的是这种简写形式

$func3 = function () {

    $name = '无忌哥哥';


    return function () use ($name) {

        return $name . ',我又被当作返回值,扫地出门啦,你还要我吗?';

    };

};


// $func3() 的返回值是一个函数,所以再加一对圆括号,才可以执行

echo $func3()();


/**

 * 现在明白了,原来闭包可以当作一个普通函数使用,也可以当作函数参数使用,甚至可以当作函数的返回值

 * 是的,闭包还有二个生效条件:第一,必须是定义一个匿名函数,  第二,必须要执行一次来生成闭包函数

 */



//以上就是最经典的三种闭包使用场景,大家记住二点即可:

//第一,必须是定义一个匿名函数,  第二,必须要执行一次来生成闭包函数



最新手记推荐

• 依赖注入小例子• 模板显示用户信息表,并分页显示• 模板继承,模仿php页面• 模拟用户登录验证的案例 依赖注入 Facade• 创建一个验证器, 用来对模型对应的表中字段进行验证处理

全部回复(0)我要回复

暂无评论~
  • 取消回复发送
  • PHP中文网