(PHP 8 >= 8.0.23, PHP 8 >= 8.1.11)
ReflectionFunctionAbstract::getClosureCalledClass — 傳回閉包內 static:: 對應的類別
返回一個對應到 Closure 內 static::
解析後的類別名稱的 ReflectionClass 類別。
此函式沒有參數。
返回一個對應於 Closure 中 static::
所表示類別的 ReflectionClass。如果該函式不是閉包,或者它具有全域作用域,則會返回 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" }