(PHP 5 >= 5.4.0, PHP 7, PHP 8)
ReflectionFunctionAbstract::getClosureScopeClass — 返回对应于闭包内部作用域的类
返回一个 ReflectionClass,它对应于 Closure 内部作用域的类。
此函数没有参数。
返回一个 ReflectionClass,对应于 Closure 内部使用其作用域的类。如果该函数不是闭包,或者它具有全局作用域,则返回 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" }