(PHP 8 >= 8.0.23, PHP 8 >= 8.1.11)
ReflectionFunctionAbstract::getClosureCalledClass — Retorna a classe correspondente a static:: dentro de uma closure
Retorna a classe como uma ReflectionClass que
corresponde a resolver o nome de classe associado a static::
dentro da
Closure.
Esta função não possui parâmetros.
Retorna uma ReflectionClass que corresponde à classe
representada por static::
na Closure.
Se a função não é uma closure ou se ela tiver escopo global, null
é retornado.
Exemplo #1 Exemplo que mostra a diferença entre ReflectionFunctionAbstract::getClosureCalledClass(), ReflectionFunctionAbstract::getClosureScopeClass(), e ReflectionFunctionAbstract::getClosureThis() com uma closure no contexto de objeto
<?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, já que uma closure não estática toma o contexto de objeto
var_dump($r->getClosureScopeClass()); // Corresponde a resolver self::class dentro de uma closure
var_dump($r->getClosureCalledClass()); // Corresponde a resolver static::class dentro de uma closure
?>
O exemplo acima produzirá:
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" }
Exemplo #2 Exemplo que mostra a diferença entre ReflectionFunctionAbstract::getClosureCalledClass(), ReflectionFunctionAbstract::getClosureScopeClass(), e ReflectionFunctionAbstract::getClosureThis() com uma closure estática sem um contexto de objeto
<?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, já que a pseudo-variável $this não está disponível no contexto estático
var_dump($r->getClosureScopeClass()); // Corresponde a resolver self::class dentro de uma closure
var_dump($r->getClosureCalledClass()); // Corresponde a resolver static::class dentro de uma closure
?>
O exemplo acima produzirá:
string(1) "A" string(1) "B" NULL object(ReflectionClass)#4 (1) { ["name"]=> string(1) "A" } object(ReflectionClass)#4 (1) { ["name"]=> string(1) "B" }