Start · Sprachen · PHP · Referenz · __PHP_Incomplete_Class

__PHP_Incomplete_Class

Klasse

Platzhalter-Klasse, die <code>unserialize()</code> erzeugt, wenn eine unbekannte oder nicht erlaubte Klasse deserialisiert wird.

seit PHP 4.0.0 Kategorie: misc

Signatur

class __PHP_Incomplete_Class

Beschreibung

__PHP_Incomplete_Class ist eine interne PHP-Klasse, die automatisch instanziiert wird, wenn unserialize() auf serialisierte Daten trifft, deren ursprüngliche Klasse entweder nicht geladen ist oder im allowed_classes-Parameter des Options-Arrays explizit verboten wurde. Das Objekt dient als sicherer Behälter für die rohen Daten und verhindert, dass PHP einen fatalen Fehler wirft.

Das erzeugte Objekt enthält eine spezielle Eigenschaft __PHP_Incomplete_Class_Name, die den ursprünglichen Klassennamen als Zeichenkette speichert. Alle anderen serialisierten Eigenschaften des Originalobjekts bleiben im Objekt erhalten und können über get_object_vars() oder – nach dem Casten zu einem Array – ausgelesen werden.

Eine häufige Nutzung ist das bewusste Einschränken erlaubter Klassen über unserialize($data, ['allowed_classes' => false]) oder eine Whitelist, um Deserialisierungs-Angriffe zu verhindern. Das zurückgegebene __PHP_Incomplete_Class-Objekt kann dann geprüft oder verworfen werden, ohne dass schädlicher Code ausgeführt wird.

Methoden können auf einem __PHP_Incomplete_Class-Objekt nicht aufgerufen werden; PHP gibt dabei einen Fehler aus. Das Objekt sollte daher nur zum Lesen der rohen Daten oder als Signal verwendet werden, dass eine Klasse beim Deserialisieren fehlte.

Beispiele

Deserialisierung einer nicht geladenen Klasse

<?php
// Eine serialisierte Instanz einer (hier nicht definierten) Klasse "UserSession"
$serialized = 'O:11:"UserSession":2:{s:4:"name";s:4:"Anna";s:4:"role";s:5:"admin";}';

// Klasse UserSession ist nicht definiert — PHP erzeugt __PHP_Incomplete_Class
$obj = unserialize($serialized);

var_dump($obj instanceof __PHP_Incomplete_Class); // bool(true)

$vars = get_object_vars($obj);
echo $vars['__PHP_Incomplete_Class_Name'] . "\n"; // UserSession
echo $vars['name'] . "\n";                        // Anna
echo $vars['role'] . "\n";                        // admin
bool(true) UserSession Anna admin

Sicheres Deserialisieren mit allowed_classes-Whitelist

<?php
class Order {
    public string $id;
    public float  $total;
}

$serializedOrder = 'O:5:"Order":2:{s:2:"id";s:6:"ORD-42";s:5:"total";d:99.95;}';
$serializedUser  = 'O:4:"User":1:{s:4:"name";s:3:"Bob";}';

// Nur Order ist erlaubt; User wird zu __PHP_Incomplete_Class
$options = ['allowed_classes' => ['Order']];

$order = unserialize($serializedOrder, $options);
$user  = unserialize($serializedUser,  $options);

var_dump($order instanceof Order);                   // bool(true)
var_dump($user  instanceof __PHP_Incomplete_Class);  // bool(true)

$vars = get_object_vars($user);
echo 'Blockierte Klasse: ' . $vars['__PHP_Incomplete_Class_Name'] . "\n"; // User
bool(true) bool(true) Blockierte Klasse: User

// Wichtig · Fallstricke

Sicherheitshinweis: Das unkontrollierte Deserialisieren von Fremddaten mit unserialize() ohne allowed_classes-Beschränkung ist gefährlich, da es zur Ausführung von beliebigem Code (PHP Object Injection) führen kann. Verwende immer eine explizite Whitelist (allowed_classes => ['KlasseA', 'KlasseB']) oder setze allowed_classes => false, um alle Klassen zu blockieren.

Methodenaufrufe auf einem __PHP_Incomplete_Class-Objekt erzeugen einen Fatal Error. Prüfe daher mit instanceof __PHP_Incomplete_Class, bevor du ein deserialisiertes Objekt weiter verwendest.

Wenn die Klasse nachträglich geladen wird (z. B. per Autoloader), bleibt das Objekt dennoch eine __PHP_Incomplete_Class-Instanz. Ein erneutes serialize() + unserialize() nach dem Laden der Klasse kann das Objekt korrekt rekonstruieren.