PHP Conference Japan 2024

ReflectionFunctionAbstract::getClosureThis

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

ReflectionFunctionAbstract::getClosureThis傳回閉包內對應 $this 的物件

描述

public ReflectionFunctionAbstract::getClosureThis(): ?object

如果函式是非靜態閉包,則取得綁定到閉包內 $this 的物件。

參數

此函式沒有參數。

傳回值

傳回 Closure$this 所代表的物件實例。如果函式不是閉包,或者沒有 $this,則會改為傳回 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