我进行了一些快速测试。我真的认为你最好使用以下方法将真实的回调存储在你的bind()函数中bind('evt_name', array($obj, 'callback_function'))
。如果您绝对想采用 spl_object_hash 路线,而不是使用事件绑定存储引用,那么您将看到如下所示的内容:
var_dump / extract 和 hash 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;
}
你最终会得到结果看起来像这样 http://gist.github.com/334793。摘要:基于类的引用实现在 n/50 个类左右性能最佳——在最佳状态下,它能够实现 1/3 的性能var_dump
基于实现,通常是much worse.
The var_dump
实施似乎是可以忍受的,尽管并不理想。但如果您没有进行太多此类查找,那么它不会成为您的瓶颈。特别是作为 PHP