PHP Conference Japan 2024

ReflectionFunctionAbstract::getClosureScopeClass

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getClosureScopeClass返回对应于闭包内部作用域的类

描述

public ReflectionFunctionAbstract::getClosureScopeClass(): ?ReflectionClass

返回一个 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"
}

参见

添加注释

用户贡献注释

此页面没有用户贡献的注释。
To Top