イニシャライザまたはファクトリを呼び出さずレイジーオブジェクトを初期化済みとしてマークする

# ReflectionClass::markLazyObjectAsInitialized

(PHP 8 >= 8.4.0)

ReflectionClass::markLazyObjectAsInitialized — イニシャライザまたはファクトリを呼び出さずレイジーオブジェクトを初期化済みとしてマークする

### 説明

public function ReflectionClass::markLazyObjectAsInitialized(object `$object`): object

イニシャライザまたはファクトリを呼び出さずレイジーオブジェクトを 初期化済みとしてマークします。`object` がレイジーでないか、 すでに初期化されている場合、このメソッドは効果がありません。

このメソッド動作は、`object` のレイジー戦略に関わらず、 初期化シーケンス においてゴーストオブジェクトに対して説明されたものとほぼ同じですが、 イニシャライザが呼び出されない点を除きます。 その後、オブジェクトは、ReflectionProperty::setRawValueWithoutLazyInitialization() または ReflectionProperty::skipLazyInitialization() で 既に初期化されたプロパティの値を除いて、 ReflectionClass::newInstanceWithoutConstructor() で作成された、 元々レイジーでなかったオブジェクトと区別がつかなくなります。

### パラメータ

`object`
  初期化済みとしてマークするオブジェクト。

### 戻り値

`object` を返します。

### 例

例1 未初期化のレイジーオブジェクトを初期化済みとしてマークする

    <?php
    class Example
    {
        public string $prop1;
        public string $prop2;
        public string $prop3 = 'default value';
    }

    $reflector = new ReflectionClass(Example::class);

    $object = $reflector->newLazyGhost(function ($object) {
        echo "Initializer called\n";
        $object->prop1 = 'initialized';
    });

    $reflector->getProperty('prop1')
              ->setRawValueWithoutLazyInitialization($object, 'prop1 value');

    var_dump($object);

    $reflector->markLazyObjectAsInitialized($object);

    var_dump($object);
    ?>

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

    lazy ghost object(Example)#3 (1) {
      ["prop1"]=>
      string(11) "prop1 value"
      ["prop2"]=>
      uninitialized(string)
      ["prop3"]=>
      uninitialized(string)
    }
    object(Example)#3 (2) {
      ["prop1"]=>
      string(11) "prop1 value"
      ["prop2"]=>
      uninitialized(string)
      ["prop3"]=>
      string(13) "default value"
    }

例2 既に初期化されたオブジェクトを初期化済みとしてマークする

    <?php
    class Example
    {
        public string $prop1;
        public string $prop2;
        public string $prop3 = 'default value';
    }

    $reflector = new ReflectionClass(Example::class);

    $object = $reflector->newLazyGhost(function ($object) {
        echo "Initializer called\n";
        $object->prop1 = 'initialized';
    });

    $reflector->getProperty('prop1')
              ->setRawValueWithoutLazyInitialization($object, 'prop1 value');

    var_dump($object->prop3);
    var_dump($object);

    $reflector->markLazyObjectAsInitialized($object);

    var_dump($object);
    ?>

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

    Initializer called
    string(13) "default value"
    object(Example)#3 (2) {
      ["prop1"]=>
      string(11) "initialized"
      ["prop2"]=>
      uninitialized(string)
      ["prop3"]=>
      string(13) "default value"
    }
    object(Example)#3 (2) {
      ["prop1"]=>
      string(11) "initialized"
      ["prop2"]=>
      uninitialized(string)
      ["prop3"]=>
      string(13) "default value"
    }

### 参考

- レイジーオブジェクト
- ReflectionClass::newLazyGhost() - 新しいレイジーゴーストインスタンスを作成する
- ReflectionClass::initializeLazyObject() - レイジーオブジェクトを強制的に初期化する
- ReflectionClass::isUninitializedLazyObject() - オブジェクトがレイジーで未初期化かどうかを調べる

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