# __PHP_Incomplete_Class クラス

(PHP 4 >=4.0.1, PHP 5, PHP 7, PHP 8)

## はじめに

未定義のクラスや、 unserialize() の `options` 配列の `allowed_classes` のリストに入っていなかったクラスを アンシリアライズしようとした場合に、 unserialize() が生成します。

PHP 7.2.0 より前のバージョンでは、 __PHP_Incomplete_Class に対して is_object() を呼び出すと `false` を返していました。 PHP 7.2.0 以降では `true` を返します。

## クラス概要

#[\AllowDynamicProperties]
final class __PHP_Incomplete_Class {
}

このクラスはデフォルトのプロパティやメソッドを持っていません。 unserialize() がこのクラスを生成した場合、 アンシリアライズされたプロパティやオブジェクトの値について、 アンシリアライズされたクラス名を含む `__PHP_Incomplete_Class_Name` プロパティを持ちます。

## 変更履歴

バージョン | 説明
--- | ---
8.0.0 | このクラスは `final` になりました。

## 例

例1 unserialize() によって生成されるクラス

    <?php

    class MyClass
    {
        public string $property = "myValue";
    }

    $myObject = new MyClass;

    $foo = serialize($myObject);

    // unserializes all objects into __PHP_Incomplete_Class objects
    $disallowed = unserialize($foo, ["allowed_classes" => false]);

    var_dump($disallowed);

    // unserializes all objects into __PHP_Incomplete_Class objects except those of MyClass2 and MyClass3
    $disallowed2 = unserialize($foo, ["allowed_classes" => ["MyClass2", "MyClass3"]]);

    var_dump($disallowed2);

    // unserializes undefined class into __PHP_Incomplete_Class object
    $undefinedClass = unserialize('O:16:"MyUndefinedClass":0:{}');

    var_dump($undefinedClass);

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

    object(__PHP_Incomplete_Class)#2 (2) {
      ["__PHP_Incomplete_Class_Name"]=>
      string(7) "MyClass"
      ["property"]=>
      string(7) "myValue"
    }
    object(__PHP_Incomplete_Class)#3 (2) {
      ["__PHP_Incomplete_Class_Name"]=>
      string(7) "MyClass"
      ["property"]=>
      string(7) "myValue"
    }
    object(__PHP_Incomplete_Class)#4 (1) {
      ["__PHP_Incomplete_Class_Name"]=>
      string(16) "MyUndefinedClass"
    }

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