2024 年日本 PHP 研討會

ReflectionFunctionAbstract::getClosureCalledClass

(PHP 8 >= 8.0.23, PHP 8 >= 8.1.11)

ReflectionFunctionAbstract::getClosureCalledClass傳回閉包內 static:: 對應的類別

說明

public ReflectionFunctionAbstract::getClosureCalledClass(): ?ReflectionClass

返回一個對應到 Closurestatic:: 解析後的類別名稱的 ReflectionClass 類別。

參數

此函式沒有參數。

回傳值

返回一個對應於 Closurestatic:: 所表示類別的 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"
}

另請參閱

新增註記

使用者提供的註記

此頁面沒有使用者提供的註記。
To Top