php 中的closure用法详解

yizhihongxing

PHP 中的 Closure 用法详解

什么是闭包(Closure)?

闭包是一种能够存储变量状态的匿名函数,可以在定义它的所在函数已经退出后执行,保留着所在函数的变量值,因此也称为 匿名函数的 引用封装那些变量

闭包的基本语法

$func = function(parameters) use ($variable) {
    // function body
};

$func :闭包函数名,用于后续的调用。

parameters :函数的参数列表。

use :引用外部变量。

$variable :在闭包函数中引用的外部变量。

示例:

function foo($x) {
   return function ($y) use ($x) {
       return $x + $y;
   };
}

$func = foo(10);
echo $func(5); // 输出 15

上述代码创建了一个叫做 foo 的函数,它返回了一个匿名函数,该匿名函数使用了 foo 中的变量 $x ,并通过参数 $y 调用该匿名函数。调用 $func(5) 返回结果为 15

闭包中的变量

闭包可以访问和修改创建闭包时对应作用域中的变量。当使用关键字 use 引入外部变量时,将创建对变量的一个引用,而不是拷贝一个副本。

示例:

$x = 1;
$y = 2;

$func = function () use (&$x, $y) {
    $x++;
    $y++;
    echo $x . ' ' . $y;
};

$func(); // 输出 2 3

使用关键字 & 可以引入外部变量的引用,外部变量的值在闭包中被修改,这对于在外部定义一个计数器是非常有用的。

带有作用域的闭包

闭包也支持使用 use 引入一个函数外部的包含作用域变量。

示例:

function foo() {
    $x = 1;

    $func = function () use ($x) {
        echo $x;
    };

    return $func;
}

$func = foo();
$func(); // 输出 1

在这个示例中,变量 $x 定义在函数 foo 内部,通过使用 use 语句,使得闭包函数可以访问到 $x 变量,该闭包函数存储在 $func 变量中,当 $func 被调用时,输出 $x 变量的值。

闭包的递归

闭包函数递归调用自身,在匿名函数体内引用函数名引用的是定义时的函数,因此需要用到自调用,使得闭包函数体内的递归函数引用实时更新到当前闭包。通过将函数名储存在变量中并在闭包中调用该变量,可以解决这个问题。

示例:

$factorial = function ($n) use (&$factorial) {
    return ($n <= 1) ? 1 : $n * $factorial($n -1);
};

echo $factorial(5); // 输出 120

通过引用传递 $factorial 变量,使得递归的闭包函数在函数体内引用最新的闭包版本。

结论

闭包为 PHP 的函数提供了更多的灵活性,使代码更加清晰明了,更加易于维护。同时,若不加注意,也可能会引发变量作用域的问题,需要注意不要造成意外的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php 中的closure用法详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 极度公式怎么用 极度公式创建数学公式教程

    首先,我们需要了解什么是极度公式。极度公式是一款在线数学公式编辑器,支持实时渲染、数学符号和LaTeX语法,适用于各种数学作业和论文撰写。 接下来介绍如何使用极度公式创建数学公式: 1. 登录注册 首先,我们需要访问极度公式的官网 https://zh.numberempire.com/latexequationeditor.php 并且登录或注册账号,才能…

    PHP 2023年5月26日
    00
  • PHP Mysqli 常用代码集合

    PHP Mysqli 常用代码集合攻略 1. 简介 mysqli是PHP中操作MySQL数据库的扩展,它提供了比之前的mysql扩展更多的功能。在使用mysqli时,我们需要先连接到要操作的数据库,然后使用mysqli提供的方法来执行SQL语句。本攻略目的是介绍mysqli的常用代码集合,帮助开发者快速上手。 2. 连接到数据库 在使用mysqli操作数据库…

    PHP 2023年5月30日
    00
  • PHP实现ASCII码与字符串相互转换的方法

    ASCII码转字符串 在PHP中,可以使用chr()函数将ASCII码转换成字符。chr()需要一个整数参数,它将返回该整数对应的ASCII字符。以下是将整数65(ASCII码为大写字母A)转换成字符的示例代码: $ascii = 65; $char = chr($ascii); echo $char; // 输出 A 字符串转ASCII码 在PHP中,可以…

    PHP 2023年5月26日
    00
  • PHP实现微信小程序在线支付功能(代码实例)

    感谢您对本网站文章的关注,下面将详细讲解“PHP实现微信小程序在线支付功能(代码实例)”的完整攻略,内容如下: 前言 微信小程序作为近年来流行的一种小型应用程序,为了提升用户体验,在线支付功能是必不可少的功能之一。本文将基于PHP语言实现微信小程序在线支付功能,并提供代码示例的操作步骤。 步骤 1. 准备工作 在实现微信小程序在线支付功能之前,需要准备以下工…

    PHP 2023年5月23日
    00
  • 继续收藏一些PHP常用函数第1/2页

    下面是详细讲解“继续收藏一些PHP常用函数第1/2页”的完整攻略: 收集常用PHP函数的方法 方法一:查看官方文档 PHP官方文档中有详细的函数列表和说明,可以直接在PHP官方文档网站上查看并学习。 方法二:查看大牛分享 除了官方文档,很多PHP开发者经常会在自己的博客或社交媒体上分享自己常用的PHP函数。可以在网络上搜索相关资料,查看大牛的分享和经验总结。…

    PHP 2023年5月23日
    00
  • php 实现收藏功能的示例代码

    要实现网站的收藏功能,需要前端和后端的配合。前端需要设置一个“收藏”按钮,用户点击后将文章ID发送到后端,后端接收并处理,将用户ID和文章ID存入数据库中。下面是实现收藏功能的示例代码: 前端代码 <button data-id="123" class="btn-favorites">收藏</butt…

    PHP 2023年5月27日
    00
  • 推荐Discuz!5的PHP代码高亮显示与实现可运行代码

    下面让我详细讲解如何推荐Discuz!5的PHP代码高亮显示,以及如何实现可运行代码的完整攻略。这个过程可以分为以下几个步骤: 1. 安装插件 要实现Discuz!5的PHP代码高亮显示,我们需要先安装一个插件。推荐使用的插件是Discuz!代码高亮插件,可以在Discuz!官网进行下载,或者直接搜索安装。下载完毕后,将插件文件夹上传至论坛目录下的 ./in…

    PHP 2023年5月23日
    00
  • PHP echo,print,printf,sprintf函数之间的区别与用法详解

    PHP echo,print,printf,sprintf 函数之间的区别与用法详解 在 PHP 中,有多种用于向页面输出内容的函数。本文将重点介绍四个常用的函数:echo、print、printf 和 sprintf。但在了解这四个函数之前,我们需要掌握以下概念: 语句(Statement):指一行代码。 表达式(Expression):指一组能计算出一个…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部