Start · Sprachen · PHP · Referenz · get_mangled_object_vars

get_mangled_object_vars

Funktion

Gibt ein Array aller Eigenschaften eines Objekts zurück, wobei die Schlüssel den internen (namens-komprimierten) Namen entsprechen, wie PHP sie intern verwaltet.

seit PHP 7.4.0 Kategorie: oop

Signatur

get_mangled_object_vars(object $object): array

Beschreibung

get_mangled_object_vars() liefert ein assoziatives Array aller Eigenschaften des übergebenen Objekts. Im Gegensatz zu get_object_vars() werden dabei die Eigenschaftsnamen nicht bereinigt, sondern so ausgegeben, wie PHP sie intern speichert – inklusive des sogenannten Name Manglings für private- und protected-Eigenschaften.

PHP kodiert den Sichtbarkeitsbereich einer Eigenschaft direkt in deren Namen: Eine private-Eigenschaft foo der Klasse Bar wird intern als \0Bar\0foo gespeichert (umgeben von Null-Bytes), eine protected-Eigenschaft als \0*\0foo. Diese Funktion gibt genau diese rohen Schlüssel zurück, was besonders beim Serialisieren, Debuggen oder beim Verarbeiten serialisierter Daten hilfreich ist.

Ein typischer Anwendungsfall ist die Analyse von deserialisierten Objekten oder das Abgleichen von Eigenschaftsnamen mit rohen Serialisierungsdaten. Auch beim Implementieren benutzerdefinierter Serialisierungsmechanismen kann es wichtig sein, den internen Eigenschaftsnamen zu kennen, um ihn korrekt zu reproduzieren.

Zu beachten ist, dass die Funktion – anders als get_object_vars() – nicht auf den Sichtbarkeitskontext des aufrufenden Codes reagiert: Sie gibt immer alle Eigenschaften zurück, unabhängig davon, ob sie öffentlich, geschützt oder privat sind.

Parameter

Name Typ Default Beschreibung
$object Pflicht object Das Objekt, dessen Eigenschaften abgerufen werden sollen. Es werden alle Eigenschaften zurückgegeben – public, protected und private.

Rückgabewert

Typ
array
Beschreibung
Ein assoziatives Array, in dem die Schlüssel den intern gespeicherten (ggf. namens-komprimierten) Eigenschaftsnamen entsprechen und die Werte den aktuellen Eigenschaftswerten. Bei private-Eigenschaften enthält der Schlüssel Null-Bytes (\0KlassenName\0eigenschaftsname), bei protected-Eigenschaften \0*\0eigenschaftsname. Öffentliche Eigenschaften erscheinen ohne Präfix.

Beispiele

Unterschied zwischen public, protected und private

<?php
class Fahrzeug
{
    public string $marke = 'BMW';
    protected int $baujahr = 2020;
    private float $preis = 35000.00;
}

$auto = new Fahrzeug();
$vars = get_mangled_object_vars($auto);

foreach ($vars as $key => $value) {
    // Null-Bytes sichtbar machen
    $sichtbarer_key = str_replace("\0", '{NUL}', $key);
    echo "$sichtbarer_key => $value\n";
}
marke => BMW {NUL}*{NUL}baujahr => 2020 {NUL}Fahrzeug{NUL}preis => 35000

Vergleich mit serialisierten Daten

<?php
class Konto
{
    public string $inhaber = 'Max Mustermann';
    protected float $saldo = 1500.50;
    private string $iban = 'DE89370400440532013000';
}

$konto = new Konto();

// Rohe serialisierte Daten
$serialized = serialize($konto);
echo $serialized . "\n\n";

// Interne Eigenschaftsnamen über get_mangled_object_vars
$vars = get_mangled_object_vars($konto);
foreach ($vars as $key => $value) {
    $anzeige = str_replace("\0", '{NUL}', $key);
    echo "$anzeige => $value\n";
}
O:5:"Konto":3:{s:7:"inhaber";s:14:"Max Mustermann";s:8:"*saldo";d:1500.5;s:13:"Kontoiban";s:22:"DE89370400440532013000";} inhaber => Max Mustermann {NUL}*{NUL}saldo => 1500.5 {NUL}Konto{NUL}iban => DE89370400440532013000

// Wichtig · Fallstricke

Unterschied zu get_object_vars(): get_object_vars() berücksichtigt den Aufrufkontext und gibt außerhalb der Klasse nur öffentliche Eigenschaften zurück. get_mangled_object_vars() hingegen gibt stets alle Eigenschaften zurück – unabhängig vom Aufrufkontext.

Null-Bytes in Schlüsseln: Die Schlüssel für private- und protected-Eigenschaften enthalten Null-Bytes (\0). Dies kann zu unerwarteten Darstellungsproblemen führen, wenn Schlüssel direkt ausgegeben werden. Verwende str_replace() oder bin2hex(), um die Schlüssel sicher anzuzeigen.

Vererbung: Bei vererbten Eigenschaften enthält der Schlüssel den Namen der ursprünglich definierenden Klasse – nicht die des aktuellen Objekts. Dies ist besonders relevant bei der manuellen Rekonstruktion serialisierter Objekte.