PHP 中的Closure
阿新 • • 發佈:2017-11-30
pre n-1 his turn all 技術分享 pri key private
PHP 中的Closure
Closure,匿名函數,又稱為Anonymous functions,是php5.3的時候引入的。匿名函數就是沒有定義名字的函數。這點牢牢記住就能理解匿名函數的定義了。
比如下面的代碼
function test() {
return 100;
};
function testClosure(Closure $callback)
{
return $callback();
}
$a = testClosure(test());
print_r($a);exit;
這裏的test()永遠沒有辦法用來作為testClosure的參數,因為它並不是“匿名”函數。
所以應該改成這樣:
$f = function () {
return 100;
};
function testClosure(Closure $callback)
{
return $callback();
}
$a = testClosure($f);
print_r($a);exit;
好,如果要調用一個類裏面的匿名函數呢?
class C {
public static function testC() {
return function($i) {
return $i+100;
};
}
}
function testClosure(Closure $callback)
{
return $callback(13);
}
$a = testClosure(C::testC());
print_r($a);exit;
應該這麽寫,其中的C::testC()返回的是一個funciton。
綁定的概念
上面的例子的Closure只是全局的的匿名函數,好了,我現在想指定一個類有一個匿名函數。也可以理解說,這個匿名函數的訪問範圍不再是全局的了,是一個類的訪問範圍。
那麽我們就需要將“一個匿名函數綁定到一個類中”。
<?php
class A {
public $base = 100;
}
class B {
private $base = 1000;
}
$f = function () {
return $this->base + 3;
};
$a = Closure::bind($f, new A);
print_r($a());
echo PHP_EOL;
$b = Closure::bind($f, new B , ‘B‘);//最後一個參數說明了 綁定匿名函數的作用於即:public or protect
print_r($b());
echo PHP_EOL;
上面的例子中,這個匿名函數中莫名奇妙的有個f這個匿名函數中莫名奇妙的有個this,這個this關鍵詞就是說明這個匿名函數是需要綁定在類中的。
綁定之後,就好像A中有這麽個函數一樣,但是這個函數是public還是private,bind的最後一個參數就說明了這個函數的可調用範圍。
對於bindTo,看例子:
<?php
class A {
public $base = 100;
}
class B {
private $base = 1000;
}
class C {
private static $base = 10000;
}
$f = function () {
return $this->base + 3;
};
$sf = static function() {
return self::$base + 3;
};
$a = Closure::bind($f, new A);
print_r($a());
echo PHP_EOL;
$b = Closure::bind($f, new B , ‘B‘);
print_r($b());
echo PHP_EOL;
$c = $sf->bindTo(null, ‘C‘);
print_r($c());
echo PHP_EOL;
from:https://www.cnblogs.com/yjf512/p/4421289.html
PHP 中的Closure