道者编程

关于PHP的闭包(Closure类)

一:概念:这段话摘自手册:

匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。在过去,这个类被认为是一个实现细节,但现在可以依赖它做一些事情。自 PHP 5.4 起,这个类带有一些方法,允许在匿名函数创建后对其进行更多的控制。

除了此处列出的方法,还有一个 __invoke 方法。这是为了与其他实现了 __invoke()魔术方法 的对象保持一致性,但调用匿名函数的过程与它无关。

二:类摘要,摘自手册:

Closure {
/* 方法 */
__construct ( void )
public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] )
public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] )
}

bind(静态闭包)有三个参数:Closure:匿名函数;newthis:绑定匿名函数的对象;newscope:闭包类的作用域

bindTo 和上面差不多,后面举例说明。

这段话看起来有些绕,不太好理解,实际举几个例子说明下!

三实例:

1:bind绑定$this对象和作用域

<?php
class A 
{
    public $str = 'My is A';
}
class B 
{
    private $str = 'My is B';
}
$ab = function () { //匿名函数 返回A类或B类的参数
    return $this->str; //这里有个this
};

$a = Closure::bind($ab, new A); //绑定或者叫注册A类,一个意思 new A对象绑定到匿名函数中
echo $a();//My is A

这里绑定了A类,A类只绑定了对象。

B类怎么绑定?

$b = Closure::bind($f, new B,'B'); //注册B类
echo $b();//My is B

B类同时绑定了对象和作用域,可以看到B类绑定的时候多了一个参数B,对照上面,B是什么?作用域,因为上面B类做的方法是private,如果不加这个,就会提示无法访问私有属性。

2:bind只绑定作用域

<?php

class B 
{
    static private $str = 'My is B';
}
$ab = function () { //匿名函数 返回A类或B类的参数
    return self::$str; //这里有个this
};

$person = new B();
$b = Closure::bind($ab, NULL,B::class); //注册B类
echo $b();//My is B
B类如果要用$this,必须传入第二个参数:$this对象。


最新评论:
我要评论:

看不清楚