いくつかの簡単なテストを実行しました。を使用して bind() 関数に実際のコールバックを格納する方がよいと本当に思いますbind('evt_name', array($obj, 'callback_function'))
。イベントバインディングで参照を保存するのではなく、絶対に spl_object_hash ルートに行きたい場合は、次のようなものを見ています。
var_dump / 抽出およびハッシュ ID の実装:
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;
}
単純な参照実装:
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;
}
これは基本的に、クラスベースの参照関数よりも全体的に 5 倍から 50 倍悪いため、心配する必要はありません。
クラス実装によるストア参照:
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;
}
最終的には、次のような結果が得られます。要約: クラス ベースの参照実装は、n/50 クラス前後で最高のパフォーマンスを発揮します。最高の状態では、ベース実装のパフォーマンスの 1/3 を引き出すことができますが、var_dump
通常ははるかに劣ります。
var_dump
理想的ではありませんが、実装は許容できるようです。しかし、これらのルックアップをあまり行わなければ、ボトルネックにはなりません。特に PHP < 5.2 boxen のフォールバックとして。