PHP基于Closure类创建匿名函数的方法详解
需积分: 0 129 浏览量
更新于2020-10-19
收藏 69KB PDF 举报
PHP中,匿名函数(也称为闭包)从PHP 5.3版本开始引入,允许程序员在定义时不需要指定函数名。这为编程提供了更高的灵活性,特别是在事件驱动、回调和函数式编程范式中显得尤为有用。PHP 5.4 引入了 Closure 类来更好地控制匿名函数。
### Closure 类的功能
Closure 类在 PHP 中代表匿名函数。它为开发者提供了一些方法,用于在匿名函数创建之后进行更多控制。Closure 类不能实例化,它主要包含两个方法:
1. `bind()`:这个静态方法允许将匿名函数绑定到一个特定对象上。它接受三个参数:要绑定的闭包,绑定到闭包的对象或 NULL(创建未绑定的闭包),以及一个类作用域参数(默认为 'static')。
- **$closure**:这是需要绑定的匿名函数。
- **$newThis**:这代表想要绑定到匿名函数的对象。如果闭包中使用了 `$this`,那么 `$newThis` 将决定这个 `$this` 指向的值。如果为 NULL,则创建一个未绑定的闭包。
- **$newScope**:这个参数用来指定闭包的类作用域。如果传入的是 'static',则保持当前作用域不变;如果传入对象,则使用对象的类作为作用域。类作用域决定了在闭包中 `$this` 对象的私有和保护方法的可见性。
2. `bindTo()`:这是一个非静态方法,功能与 `bind()` 类似,但是它是绑定到对象的实例上。这使得可以创建闭包的副本来修改作用域和 `$this`。
### 常用函数使用技巧及相关注意事项
1. 当使用 `bind()` 或 `bindTo()` 方法时,如果闭包中使用了 `$this` 关键字,并且闭包需要访问 `$this` 的私有或保护成员时,需要特别注意类作用域的设置。如果闭包使用了 `$this` 而没有正确设置类作用域,尝试访问保护或私有成员时会抛出错误。
2. 当需要修改对象中的私有或保护成员时,闭包被绑定的对象必须能够访问这些成员。在 `bind()` 方法中,第三个参数可以设置为类名或类的实例,以允许访问这些成员。
3. 闭包可以接受参数,也可以没有参数。当闭包被创建时,可以定义参数列表,随后在调用闭包时传入相应的参数值。
### 实例分析
假设有一个类 T,其中包含私有、保护和公共方法。如果尝试创建一个闭包直接引用 `$this` 并调用这些方法,会遇到问题。
```php
class T {
private function show() {
echo "我是T里面的私有函数:show\n";
}
protected function who() {
echo "我是T里面的保护函数:who\n";
}
public function name() {
echo "我是T里面的公共函数:name\n";
}
}
$test = new T();
$func = Closure::bind(function() {
$this->who();
$this->name();
$this->show();
}, $test);
$func(); // 这将导致一个致命错误
```
上述代码尝试在匿名函数中直接调用 `$this->who()`,但由于 `$this` 在匿名函数中没有明确指向,代码会失败。为了解决这个问题,我们需要在 `bind()` 方法中指定正确的类作用域。
```php
$func = Closure::bind(function() {
$this->who();
$this->name();
$this->show();
}, $test, 'T');
$func(); // 现在可以正常访问保护和私有成员
```
在上面的例子中,通过将 `newScope` 参数设置为类名 'T',我们告诉闭包,它应当运行在类 T 的作用域内。现在,该闭包可以正确地访问 T 类的保护方法 `who()` 和私有方法 `show()`。
### 传递参数给闭包
闭包也可以设计为接受参数。这允许闭包在内部使用外部传入的值。
```php
$test = new stdClass();
var_dump($test);
$func = Closure::bind(function($obj) {
$obj->name = "燕睿涛";
}, null);
$func($test);
var_dump($test);
```
在这个例子中,闭包接受 `$obj` 参数,并修改了传入对象 `$test` 的 `name` 属性。使用 `bind()` 方法时,由于闭包不绑定到任何对象,第一个参数被设置为 NULL。
通过以上示例,我们可以看出 PHP 中 Closure 类在创建和控制匿名函数方面提供的强大功能。然而,使用时需要格外注意作用域和 `$this` 的处理。这些技巧和注意事项对于编写健壮的 PHP 代码是非常重要的。
weixin_38655484
- 粉丝: 4
- 资源: 909
最新资源
- VMware-Workstation-17.6.2-24409262.x86-64.bundle.tar
- 基于ssm的莲湖小区疫情物资管理系统源码(java毕业设计完整源码).zip
- Screenshot_20241230_124309_com.tencent.tmgp.pubgmhd.jpg
- 不同颜色球体检测10-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- ABB机器人二次开发 C#读取和写入数据,可以获取点位信息及写入点位信息 自己写的ABB机器人类,机器人常规操作功能都有,非常适合进行二次开发
- 基于ssm的面向社区健康服务的医疗平台源码(java毕业设计完整源码+LW).zip
- 基于ssm的明星周边在线购物商城源码(java毕业设计完整源码).zip
- VMware-Workstation-16.2.5-20904516.x86-64.bundle.tar
- 新能源汽车车载双向OBC,PFC,LLC,V2G 双向 充电桩 电动汽车 车载充电机 充放电机 MATLAB仿真模型 : (1)基于V2G技术的双向AC DC、DC DC充放电机MATLAB仿真模型
- 基于ssm的农产品销售系统源码(java毕业设计完整源码+LW).zip
- 固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码,使用 的是固高GTS-800 8轴运动控制卡 资料齐全,3轴点胶机样本程序,还有操作手册及各种C#事例程序,适合自己参照做二次开发,GTS-4
- VMware-Workstation-15.5.7-17171714.x86-64.bundle.tar
- 一种手机电池粘胶机sw18可编辑全套技术资料100%好用.zip
- 基于Python控制台的二手房预测可视化分析
- 高校教材订购系统的数据库设计方案和技术实现要点
- 光伏并网逆变器资料,包含原理图,pcb,源码以及元器件明细表 如下: 1) 功率接口板原理图和pcb,元器件明细表 2) 主控DSP板原理图(pdf);如果有需要,可发mentor版本的原