PHP中的Closure閉包
阿新 • • 發佈:2019-01-28
一、Closure是什麼
PHP中的Closure
,即匿名函式(Anonymous functions),也叫閉包。允許臨時建立一個沒有指定名稱的函式。最經常用作回撥函式引數的值。
比如下面的例子:
<?php
$f = function() {
return "Hello, Closure!\n";
};
function testClosure(Closure $callback)
{
return $callback();
}
print_r(testClosure($f));
其中$f
是一個匿名函式的變數,當把它作為引數傳給testClosure()
時會自動轉換成內建類Closure
匿名函式(閉包)可以使用use
關鍵字傳入上層作用域的變數:
<?php
$datetime = date("Y-m-d H:i:s",time());
$f = function() use ($datetime) {
return "[$datetime] Hello, Closure!\n";
};
function testClosure(Closure $callback)
{
return $callback();
}
print_r(testClosure($f));
二、Closure內建類
Closure
類定義如下:
final class Closure {
/**
* 複製當前閉包物件,繫結指定的$this物件和類作用域。
*/
function bindTo($newthis, $newscope = 'static') { }
/**
* Closure::bindTo的靜態版本
*/
static function bind(Closure $closure, $newthis, $newscope = 'static') { }
/**
* 繫結閉包物件到$newthis,並使用引數$parameters進行呼叫
*/
function call ($newThis, ...$parameters) {}
/**
* 將一個callable物件轉換成一個閉包物件
*/
public static function fromCallable (callable $callable) {}
}
其中call()
和fromCallable()
是從PHP 7.0以後新增的。
三、繫結
Closure
類的bindTo()
和bind()
方法提供了將一個閉包繫結到一個類物件的功能
<?php
class A {
private $value = 111;
}
class B {
private $value = 222;
}
$f = function() {
return $this->value;
};
$objectA = new A();
$functionA = $f->bindTo($objectA, $objectA);
print_r($functionA());
$objectB = new B();
$functionB = $f->bindTo($objectB, $objectB);
print_r($functionB());
上面的例子將一個匿名函式$f
繫結到類的例項,這樣就可以在匿名函式中訪問物件的成員變量了。
$objectA = new A();
$functionA = Closure::bind($f, $objectA, $objectA);
print_r($functionA());
$objectB = new B();
$functionB = Closure::bind($f, $objectB, $objectB);
print_r($functionB());
對於靜態的bind
功能一樣。