クロージャ内部の $this に関連付けられたオブジェクトを返す

# ReflectionFunctionAbstract::getClosureThis

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

ReflectionFunctionAbstract::getClosureThis — クロージャ内部の $this に関連付けられたオブジェクトを返す

### 説明

public function ReflectionFunctionAbstract::getClosureThis(): ?object

関数が static でないクロージャの場合に、 クロージャ内部で $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, since a non-static closure take the object context
    var_dump($r->getClosureScopeClass()); // Corresponds to the self::class resolution inside a closure
    var_dump($r->getClosureCalledClass()); // Corresponds to the static::class resolution inside a closure

    ?>

上の例の出力は以下となります。

    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 この例は、オブジェクトコンテキストが存在しない static なクロージャについて、 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, since the pseudo-variable $this is not available in a static context
    var_dump($r->getClosureScopeClass()); // Corresponds to the self::class resolution inside a closure
    var_dump($r->getClosureCalledClass()); // Corresponds to the static::class resolution inside a closure

    ?>

上の例の出力は以下となります。

    string(1) "A"
    string(1) "B"
    NULL
    object(ReflectionClass)#4 (1) {
      ["name"]=>
      string(1) "A"
    }
    object(ReflectionClass)#4 (1) {
      ["name"]=>
      string(1) "B"
    }

### 参考

- ReflectionFunctionAbstract::getClosureCalledClass() - クロージャ内部で static:: に対応するクラスを返す
- ReflectionFunctionAbstract::getClosureScopeClass() - クロージャ内部のスコープに関連づけられたクラスを返す
- 遅延静的束縛 (Late Static Bindings)

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open