Start · Sprachen · PHP · Referenz · spl_object_hash

spl_object_hash

Funktion

Gibt einen eindeutigen Hash-String für ein Objekt zurück, der während der Lebensdauer des Objekts konstant bleibt.

seit PHP 5.2.0 Kategorie: oop

Signatur

spl_object_hash(object $object): string

Beschreibung

spl_object_hash() berechnet einen eindeutigen Hash-String für das übergebene Objekt. Dieser Hash ist für die gesamte Lebensdauer des Objekts in der aktuellen PHP-Anfrage garantiert eindeutig und unveränderlich. Er kann genutzt werden, um Objekte als Schlüssel in assoziativen Arrays zu verwenden, da PHP selbst keine Objekte als Array-Schlüssel unterstützt.

Der zurückgegebene String ist ein 32-stelliger hexadezimaler Wert. Wichtig: Nachdem ein Objekt zerstört wurde, kann sein Hash-Wert von einem neu erzeugten Objekt wiederverwendet werden – zwei unterschiedliche Objekte können also denselben Hash haben, wenn sie nicht gleichzeitig existieren.

Ein typischer Anwendungsfall ist die Implementierung einer Objekt-Map oder eines Caches, bei dem Objekte als Schlüssel dienen sollen. Alternativ bietet sich ab PHP 7.2 auch spl_object_id() an, die eine Integer-ID zurückgibt und performanter ist.

Der Hash hängt nicht vom Inhalt des Objekts ab, sondern von seiner Identität (Speicheradresse). Zwei Objekte mit identischem Zustand haben unterschiedliche Hashes, solange sie verschiedene Instanzen sind.

Parameter

Name Typ Default Beschreibung
$object Pflicht object Das Objekt, dessen Hash-ID ermittelt werden soll.

Rückgabewert

Typ
string
Beschreibung
Gibt einen 32-stelligen hexadezimalen String zurück, der das Objekt während seiner Lebensdauer eindeutig identifiziert.

Beispiele

Objekte als Array-Schlüssel verwenden

<?php
class User {
    public function __construct(public string $name) {}
}

$alice = new User('Alice');
$bob   = new User('Bob');

$roles = [];
$roles[spl_object_hash($alice)] = 'admin';
$roles[spl_object_hash($bob)]   = 'editor';

echo $roles[spl_object_hash($alice)]; // admin
echo PHP_EOL;
echo $roles[spl_object_hash($bob)];   // editor
admin editor

Wiederverwendung von Hashes nach Objekt-Zerstörung

<?php
class Foo {}

$a = new Foo();
$hashA = spl_object_hash($a);
echo 'Hash A: ' . $hashA . PHP_EOL;

unset($a); // Objekt wird zerstört

$b = new Foo();
$hashB = spl_object_hash($b);
echo 'Hash B: ' . $hashB . PHP_EOL;

// Hash B kann identisch mit Hash A sein, da der Speicher wiederverwendet wird
echo 'Gleich: ' . ($hashA === $hashB ? 'ja' : 'nein') . PHP_EOL;
Hash A: 000000007f3a1b2c0000000012345678 Hash B: 000000007f3a1b2c0000000012345678 Gleich: ja

Vergleich von Objekt-Identität

<?php
class Config {}

$cfg1 = new Config();
$cfg2 = new Config();
$cfg3 = $cfg1; // Referenz auf dasselbe Objekt

var_dump(spl_object_hash($cfg1) === spl_object_hash($cfg2)); // false: unterschiedliche Instanzen
var_dump(spl_object_hash($cfg1) === spl_object_hash($cfg3)); // true: gleiche Instanz
bool(false) bool(true)

// Wichtig · Fallstricke

Achtung bei Hash-Wiederverwendung: Wenn ein Objekt zerstört wird (unset() oder Ende des Gültigkeitsbereichs) und anschließend ein neues Objekt erzeugt wird, kann dieses denselben Hash erhalten. Langlebige Maps oder Caches, die auf spl_object_hash() basieren, sollten daher sicherstellen, dass referenzierte Objekte am Leben bleiben.

Alternative: Ab PHP 7.2 steht spl_object_id() zur Verfügung, die eine Integer-ID zurückgibt. Diese ist performanter und eignet sich ebenfalls zur Identifizierung von Objekten. Für Schlüssel in Arrays ist spl_object_id() oft die bessere Wahl.

Für eine echte Objekt-Map mit automatischer Speicherverwaltung empfiehlt sich die Verwendung von SplObjectStorage, die speziell für diesen Zweck konzipiert ist.