(PHP 8 >= 8.0.23,PHP 8 >= 8.1.11)
ReflectionFunctionAbstract::getClosureCalledClass — 返回闭包内部 static:: 对应的类
返回一个 ReflectionClass,它对应于解析 Closure 内部 static::
对应的类名。
此函数没有参数。
返回一个 ReflectionClass,对应于 Closure 中 static::
表示的类。如果该函数不是闭包或者它具有全局作用域,则返回 null
。
示例 #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" }