(PHP 5 >= 5.4.0,PHP 7,PHP 8)
ReflectionFunctionAbstract::getClosureThis — 傳回閉包內對應 $this 的物件
此函式沒有參數。
範例 #1 範例展示物件環境中的閉包,ReflectionFunctionAbstract::getClosureCalledClass()、ReflectionFunctionAbstract::getClosureScopeClass() 和 ReflectionFunctionAbstract::getClosureThis() 之間的差異
<?php
class A
{
public function getClosure()
{
var_dump(self::class, static::class);
return function() {};
}
}
class B extends A {}
$b = new B();
$c = $b->getClosure();
$r = new ReflectionFunction($c);
var_dump($r->getClosureThis()); // $this === $b,因為非靜態閉包會取得物件環境
var_dump($r->getClosureScopeClass()); // 對應於閉包內的 self::class 解析
var_dump($r->getClosureCalledClass()); // 對應於閉包內的 static::class 解析
?>
上面的範例會輸出
string(1) "A" string(1) "B" object(B)#1 (0) { } object(ReflectionClass)#4 (1) { ["name"]=> string(1) "A" } object(ReflectionClass)#4 (1) { ["name"]=> string(1) "B" }
範例 #2 範例展示沒有物件環境的靜態閉包,ReflectionFunctionAbstract::getClosureCalledClass()、ReflectionFunctionAbstract::getClosureScopeClass() 和 ReflectionFunctionAbstract::getClosureThis() 之間的差異
<?php
class A
{
public function getClosure()
{
var_dump(self::class, static::class);
return static function() {};
}
}
class B extends A {}
$b = new B();
$c = $b->getClosure();
$r = new ReflectionFunction($c);
var_dump($r->getClosureThis()); // NULL,因為偽變數 $this 在靜態環境中不可用
var_dump($r->getClosureScopeClass()); // 對應於閉包內的 self::class 解析
var_dump($r->getClosureCalledClass()); // 對應於閉包內的 static::class 解析
?>
上面的範例會輸出
string(1) "A" string(1) "B" NULL object(ReflectionClass)#4 (1) { ["name"]=> string(1) "A" } object(ReflectionClass)#4 (1) { ["name"]=> string(1) "B" }