Ich habe ein paar schnelle Tests durchgeführt. Ich denke wirklich, dass es besser wäre, echte Callbacks in Ihrer bind() - Funktion zu speichern, indem Sie bind('evt_name', array($obj, 'callback_function'))
verwenden. Wenn Sie unbedingt die spl_object_hash Weg gehen wollen, anstatt Referenzen mit den Ereignisbindungen zu speichern, sind Sie auf der Suche auf etwas wie folgt aus:
A Var_dump/Extrakt und Hash-ID Implementierung:
function spl_object_hash_var_dump($object){
if (is_object($object)){
ob_start();
var_dump($object);
$dump = ob_get_contents();
ob_end_clean();
if (preg_match('/^object\(([a-z0-9_]+)\)\#(\d)+/i', $dump, $match)) {
return md5($match[1] . $match[2]);
}
}
return null;
}
eine naive Referenzen Umsetzung:
function spl_object_dumb_references(&$object) {
static $hashes;
if (!isset($hashes)) $hashes = array();
// find existing instance
foreach ($hashes as $hash => $o) {
if ($object === $o) return $hash;
}
$hash = md5(uniqid());
while (array_key_exists($hash, $hashes)) {
$hash = md5(uniqid());
}
$hashes[$hash] = $object;
return $hash;
}
Dieser war im Grunde 5-50x schlechter als die klassenbasierte Referenzfunktion für die boa rd, also lohnt es sich nicht, sich Sorgen zu machen.
Ein Geschäft Referenzen von Klassenimplementierung:
function spl_object_hash_references(&$object) {
static $hashes;
if (!isset($hashes)) $hashes = array();
$class_name = get_class($object);
if (!array_key_exists($class_name, $hashes)) {
$hashes[$class_name] = array();
}
// find existing instance
foreach ($hashes[$class_name] as $hash => $o) {
if ($object === $o) return $hash;
}
$hash = md5(uniqid($class_name));
while (array_key_exists($hash, $hashes[$class_name])) {
$hash = md5(uniqid($class_name));
}
$hashes[$class_name][$hash] = $object;
return $hash;
}
und Sie am Ende mit results that look like this auf. Zusammenfassung: Die klassenbasierte Referenzimplementierung schneidet am besten bei n/50 Klassen ab - im besten Fall erreicht sie 1/3 der Performance der var_dump
basierten Implementierung, und es ist normalerweise viel schlechter.
Die var_dump
Implementierung scheint zu tolerieren, obwohl nicht ideal. Aber wenn Sie nicht zu viele dieser Nachschlagewerke machen, ist das kein Flaschenhals für Sie. Besonders als Ausweichmöglichkeit für PHP < 5.2 Boxen.
Warum brauchen Sie das? Vielleicht ist die wirkliche Lösung, dass Sie das nicht brauchen - was auf ein Problem in Ihrem Design hindeuten könnte? –
Ich arbeite an einem CMS und baue ein 'Event' System. Ereignisse können mit folgendem Code ausgelöst werden: 'trigger ('evt_name', new Event())'. CMS-Plugins können mit 'bind ('evt_name', 'callback_function')' an Systemereignisse 'binden'. Was ich tun möchte, ist ein weiteres Argument für beide Funktionen hinzuzufügen, das eine Instanz akzeptiert, an die ein Ereignis gebunden werden soll. Um Ereignisdaten (außerhalb des Objekts selbst) zu speichern, muss ich sie jedoch in eine eindeutige Zeichenfolge konvertieren Array-Schlüssel. Was sind deine Gedanken? – Rowan
Ich habe keine Antwort darauf, aber wenn ich mehr weiß, könnte es vielleicht helfen * (auch wenn nicht ich ^^) * - Egal was, ich habe noch nie das Bedürfnis verspürt irgendeine Art von " eindeutige ID "für ein Objekt ;; Vielleicht könntest du nur einen Verweis auf das Objekt speichern? –