PHP Conference Nagoya 2025

__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 を返します。

クラス概要

class __PHP_Incomplete_Class {
}

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

例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"
}

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top