PHP Conference Japan 2024

Closure 类

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

简介

用于表示匿名函数的类。

匿名函数会生成此类型的对象。此类具有允许在创建匿名函数后进一步控制匿名函数的方法。

除了此处列出的方法外,此类还具有一个__invoke方法。这与实现调用魔法的其他类保持一致,因为此方法不用于调用函数。

类概要

final class Closure {
/* 方法 */
private __construct()
public static bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure
public bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure
public call(object $newThis, mixed ...$args): mixed
public static fromCallable(callable $callback): Closure
}

目录

添加注释

用户贡献的注释 4 个注释

466
chuck at bajax dot us
9 年前
这在一段时间前让我感到困惑,当时我还在学习什么是闭包以及如何使用它们,但是 PHP 中所谓的闭包与其他语言(例如 JavaScript)中所说的闭包并不相同。

在 JavaScript 中,闭包可以被认为是一个作用域,当您定义一个函数时,它会默默地继承其定义所在的作用域,这被称为其闭包,并且无论它在何处使用都会保留该作用域。多个函数可以共享相同的闭包,并且只要它们在其可访问的作用域内,它们就可以访问多个闭包。

在 PHP 中,闭包是一个可调用的类,您已手动绑定了其参数。

这是一个细微的差别,但我认为值得一提。
105
joe dot scylla at gmail dot com
8 年前
一个小技巧。您可以通过引用在闭包本身中使用闭包。

删除目录及其所有子目录和文件的示例

<?php
$deleteDirectory
= null;
$deleteDirectory = function($path) use (&$deleteDirectory) {
$resource = opendir($path);
while ((
$item = readdir($resource)) !== false) {
if (
$item !== "." && $item !== "..") {
if (
is_dir($path . "/" . $item)) {
$deleteDirectory($path . "/" . $item);
} else {
unlink($path . "/" . $item);
}
}
}
closedir($resource);
rmdir($path);
};
$deleteDirectory("path/to/directoy");
?>
71
luk4z_7 at hotmail dot com
9 年前
作用域
闭包封装其作用域,这意味着它无法访问其定义或执行的作用域。但是,可以使用 use 关键字将变量从父作用域(闭包定义所在的作用域)继承到闭包中

function createGreeter($who) {
return function() use ($who) {
echo "Hello $who";
};
}

$greeter = createGreeter("World");
$greeter(); // Hello World

这按值继承变量,即在闭包内部使用其原始名称创建副本。
来源:Zend 认证学习指南。
3
info at ensostudio dot ru
2 年前
比较闭包
<?php
(字符串) new ReflectionFunction($fn) === (字符串) new ReflectionFunction($fn2)
?>
To Top