IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 如何理解 PHP 匿名函数,闭包?二者有什么关系? -> 正文阅读

[PHP知识库]如何理解 PHP 匿名函数,闭包?二者有什么关系?

php 匿名函数主要有两个应用场景:

变量赋值;函数/方法参数;

先看二段匿名函数代码(自己写下这二个闭包分别输出什么值):

$example = function () {
    var_dump($message);
};
echo $example();
$message = 'hello';
$example = function () use ($message) {
    var_dump($message);
};
echo $example();

上面二个匿名函数被调用时,分别输出 NULL,string(5) "hello"。

下面分析下匿名函数是如何被执行的:

匿名函数在赋值给一个变量时,PHP 会自动进行转化,即把匿名函数转化为闭包的实例,闭包实例内有个方法 __invoke(),__invoke() 的方法体为匿名函数的方法体。所以匿名函数赋值给变量,变量的类型其实是 object,也是闭包类 Closure 的实例。

由原理可知,执行 $example() 时,其实是把 $example 当函数一样调用,会自动触发方法 __invoke()。

__invoke() 说明:

它是 PHP 的一个魔术方法,尝试以调用函数的方式调用一个对象时,__invoke() 会被自动调用。

上面二段代码,第二段为啥会输出 hello 呢?在输出 hello 前,代码到底发生了什么变化?

1,通过匿名函数给变量赋值时,匿名函数自动进行了闭包的实例化。

2,实例化时,use 后面的变量会作为实例的属性,变量值会作为属性值。可以理解为:

$message = 'hello';
$example = function () use ($message) {
    var_dump($message);
};

等价于:

$example = new Closure();
$example->message = 'hello';
// 以及下一步讲的 __invoke()

3,匿名函数的函数体会成为 __invoke() 的函数体。匿名函数体用到的变量有二种,一种是匿名函数参数,另一种是 use 后面的变量,参数和平时类的方法参数传递及使用没有区别,但是 use 后面的变量 $message 会在函数体内变为 $this->message。

$example 的打印结果:

附加一段代码,进一步理解一下匿名函数:

function enclosePerson($name)
{
    return function ($doCommand) use ($name) {
        return sprintf('%s , %s', $name, $doCommand);
   };
}
//把字符串“Clay”封装在闭包中
$clay = enclosePerson('Clay');
//传入参数,调用闭包
echo $clay('get me sweat tea!'); // Clay, get me sweat tea!

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:45:27  更:2022-01-14 01:46:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:47:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码