加入收藏 | 设为首页 | 会员中心 | 我要投稿 无锡站长网 (https://www.0510zz.cn/)- 运维、开发、CDN、操作系统、语音技术!
当前位置: 首页 > 教程 > 正文

解析PHP闭包及Clourse类方法的作用

发布时间:2022-08-11 11:24:39 所属栏目:教程 来源:互联网
导读:PHP Clourse(闭包类) 浅析 0x00 前言 闭包是指在创建时封装周围状态的函数。即使闭包所在的环境不存在了,闭包中封装的状态依然存在。 在 PHP 里所有的闭包都是 Clourse 类所实例化的一个对象,也就是说闭包与其他 PHP 对象没有什么不同。而一个对象就必然有
     PHP Clourse(闭包类) 浅析
0x00 前言
 
闭包是指在创建时封装周围状态的函数。即使闭包所在的环境不存在了,闭包中封装的状态依然存在。
 
在 PHP 里所有的闭包都是 Clourse 类所实例化的一个对象,也就是说闭包与其他 PHP 对象没有什么不同。而一个对象就必然有其方法和属性,这篇文章将总结 PHP 中闭包的基础用法和 Clourse 类方法的作用。【推荐:PHP视频教程】
 
0x01 闭包基本用法
 
下面看看最基本的闭包使用方法:
 
 
 
 
 
 
 
<?php
 
$hello = function ($word) {
 
    return 'hello ' . $word;
 
};
 
echo $hello('world');
 
// 输出 hello world
 
嘿,这段代码最直观的感受就是将一个函数赋值给了 $hello 变量,然后通过 $hello 直接调用它。但是这个闭包并没有从父作用域中继承变量(就是封装周围状态),我们可以通过 use 关键字从闭包的父作用域继承变量。示例如下:
 
 
 
 
 
 
 
 
<?php
 
$name = 'panda';
 
$hello = function () use ($name) {
 
    return 'hello ' . $name;
 
};
 
echo $hello();
 
// 输出 hello panda
 
PHP 7.1 起,use 不能传入此类变量: superglobals、 $this 或者和参数重名。
 
此外在使用 use 关键字时,父作用域的变量是通过值传递进闭包的。也就是说一旦闭包创建完成,外部的变量即使修改也不会影响传递进闭包内的值(就是即使闭包所在的环境不存在了,闭包中封装的状态依然存在)。示例如下:
 
 
 
 
 
 
 
 
 
<?php
 
$name = 'panda';
 
$hello = function () use ($name) {
 
    return 'hello ' . $name;
 
};
 
$name = 'cat';
 
echo $hello();
 
// 输出 hello panda
 
传递变量的引用可以使闭包修改外部变量的值,示例如下:
 
 
 
 
 
 
 
 
 
<?php
 
$name = 'panda';
 
$changeName = function () use (&$name) {
 
    $name = 'cat';
 
};
 
$changeName();
 
echo $name;
 
// 输出 cat
 
注意:PHP 中传递对象时,默认是以引用传递所以在闭包内操作 use 传递的对象时需要特别注意。示例如下:
 
 
 
 
 
 
 
 
 
 
 
 
<?php
 
class Dog {
 
    public $name = 'Wang Cai';
 
}
 
$dog = new Dog();
 
$changeName = function () use ($dog) {
 
    $dog->name = 'Lai Fu';
 
};
 
$changeName();
 
echo $dog->name;
 
// 输出 Lai Fu
 
0x02 Clourse 类
 
证明闭包只是 Clourse 类对象
 
 
 
 
 
 
 
 
 
<?php
 
$clourse = function () {
 
    echo 'hello clourse';
 
};
 
if (is_object($clourse)) {
 
    echo get_class($clourse);
 
}
 
// 输出 Closure
 
上面的代码将输出 Closure 证明了闭包只是一个普通的 Closure 类对象。
 
Clourse 类摘要
 
我们可以从 PHP 官方手册 看到闭包类的相关信息,下面是我在 PhpStorm 的本地文档查看到 Clourse 类摘要。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
 
 * Class used to represent anonymous functions.
 
 * <p>Anonymous functions, implemented in PHP 5.3, yield objects of this type.
 
 * This fact used to be considered an implementation detail, but it can now be relied upon.
 
 * Starting with PHP 5.4, this class has methods that allow further control of the anonymous function after it has been created.
 
 * <p>Besides the methods listed here, this class also has an __invoke method.
 
 * This is for consistency with other classes that implement calling magic, as this method is not used for calling the function.
 
 * @link http://www.php.net/manual/en/class.closure.php
 
 */
 
final class Closure {
 
    /**
 
     * This method exists only to disallow instantiation of the Closure class.
 
     * Objects of this class are created in the fashion described on the anonymous functions page.
 
     * @link http://www.php.net/manual/en/closure.construct.php
 
     */
 
    private function __construct() { }
 
    /**
 
     * This is for consistency with other classes that implement calling magic,
 
     * as this method is not used for calling the function.
 
     * @param mixed $_ [optional]
 
     * @return mixed
 
     * @link http://www.php.net/manual/en/class.closure.php
 
     */
 
    public function __invoke(...$_) { }
 
    /**
 
     * Duplicates the closure with a new bound object and class scope
 
     * @link http://www.php.net/manual/en/closure.bindto.php
 
     * @param object $newthis The object to which the given anonymous function should be bound, or NULL for the closure to be unbound.
 
     * @param mixed $newscope The class scope to which associate the closure is to be associated, or 'static' to keep the current one.
 
     * If an object is given, the type of the object will be used instead.
 
     * This determines the visibility of protected and private methods of the bound object.

(编辑:无锡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读