Signatur
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
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
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;
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
// 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.