1. 程式人生 > >PHP中的Closure閉包

PHP中的Closure閉包

一、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功能一樣。