我跑了几个快速测试。我真的认为你最好使用bind('evt_name', array($obj, 'callback_function'))
在你的bind()函数中存储真正的回调。如果你绝对想要去的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-50x更糟rd,所以不值得担心。
一个引用存储由类实现:
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;
}
而且你结束了results that look like this。总结:基于类的引用实现执行最好的周围N/50类 - 在其最好的,它管理拉断1/3 var_dump
根据实现的性能,而且它通常多更糟。
的var_dump
实施似乎是可以容忍的,但效果并不理想。但是,如果你没有做太多这些查找,它不会成为你的瓶颈。特别是作为PHP < 5.2 boxen的后备。
为什么你需要这个?也许真正的解决方案会让你不需要这个 - 这可能表明设计中存在一些问题? – 2010-02-19 20:55:33
我正在研究CMS,并正在构建“事件”系统。事件可以使用以下代码触发:'trigger('evt_name',new Event())'。 CMS插件可以使用bind('evt_name','callback_function')'绑定'系统事件。我想要做的是为这两个函数添加另一个参数,该函数接受一个事件应该绑定的实例,但为了存储事件数据(在对象本身之外),我需要将它转换为一个唯一的字符串用作数组键。你怎么看? – Rowan 2010-02-19 21:02:00
我对此没有真正的答案,但我知道更多可能会有所帮助*(即使不是我)^ - 不管怎样,我从来没有觉得有必要获得任何类型的“唯一ID“为一个对象;;也许你只能在某处存储对象的引用? – 2010-02-19 21:05:45