【发布时间】:2011-01-18 23:01:09
【问题描述】:
我正在尝试获取 PHP 5+ 中对象实例的唯一 ID。
函数 spl_object_hash() 可从 PHP 5.2 获得,但我想知道是否有针对旧 PHP 版本的解决方法。
php.net 上的 cmets 中有几个函数,但它们对我不起作用。第一个(简化):
function spl_object_hash($object){
if (is_object($object)){
return md5((string)$object);
}
return null;
}
不适用于原生对象(如 DOMDocument),第二个:
function spl_object_hash($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;
}
看起来它可能是一个主要的性能破坏者!
有没有人有事?
【问题讨论】:
-
为什么需要这个?也许真正的解决方案是您不需要这个——这可能表明您的设计存在问题?
-
我正在开发一个 CMS 并正在构建一个“事件”系统。可以使用以下代码触发事件:
trigger('evt_name', new Event())。 CMS 插件可以使用bind('evt_name', 'callback_function')“绑定”到系统事件。我想做的是向两个函数添加另一个参数,该参数接受事件应该绑定到的实例,但是要存储事件数据(在对象本身之外),我需要将其转换为唯一的字符串以用作数组键。你有什么想法? -
我对此并没有真正的答案,但我虽然知道更多可能会有所帮助(即使不是我^^)——无论如何,我'从来没有觉得需要为一个对象获取任何类型的“唯一 ID”;;也许您只能在某处存储对该对象的引用?
-
我可以存储对实例的引用,但这需要在每次触发事件时进行大量数组迭代(以检查每个绑定是否附加到触发事件的对象)。我知道还有其他方法可以解决这个问题,但我仍然想知道是否有更好的方法来模拟
spl_object_hash()。 -
我也没有明确的答案,但它不是归结为一个简单的数组($obj,$data),其中的关键是无关紧要的吗?