对象为字符串,PHP中的唯一键

| 我在阅读有关“观察者”模式的文章,并发现了一篇过时的文章。通读后,我注意到本段有趣的提及:   在这里查看的关键方法是attach(),detach()和notify()。 attach()和detach()处理添加和删除观察者。我们在这里使用一些技巧。字符串上下文中引用的对象解析为唯一标识符(即使已定义__toString())。您可以使用此事实为关联数组构建键。 notify()方法在所有附加的观察者之间循环,在每个观察者上调用update()。在这种情况下,只要有重要报告上载和错误的消息,UploadManager类就会调用notify()。 参考以下示例:
function attach(UploadObserver $obs) {
    $this->observers[\"$obs\"] = $obs;
}
现在,如前所述,本文已过时。将对象强制转换为字符串当然不再会以这种方式起作用(我在我的开发箱上运行5.3.6,并将其推送给所有客户端项目),但是我想实现类似的功能。我只能想到(这样):
function attach(Observer $observer){
    $this->_observers[md5(serialize($observer))] = $observer;
}

function detach(Observer $observer){
    unset($this->_observers[md5(serialize($observer))]);
}
我很好奇,还有其他有效的方法可以实现这一目标吗?从对象本身创建唯一键。 警告:我不想进入已定义的键,我经常将它们与其他存储库一起使用,例如实现
__set($key, $value)
等。 注意:我知道MD5并不理想。 更新:刚刚找到了spl_object_hash,我认为这可能是我最好的选择,但是请随时分享您的想法。     
已邀请:
        您是对的,这种方式不再起作用。您可能要改用其他功能::3ѭ
function attach(Observer $observer){
    $this->_observers[spl_object_hash($observer)] = $observer;
}

function detach(Observer $observer){
    unset($this->_observers[spl_object_hash($observer)]);
}
基于序列化的方法存在一个设计问题:顺便说一句:当对象的值相同时,换句话说,如果对象返回相同的序列化值,例如空值。当对象实现“ 5”接口时,这完全可由对象自己控制。     
        您是否尝试过SPL对象哈希函数?     
        或者,您可以直接使用SplObjectStorage。 喜欢:
function __construct(...){
    $this->_observers = new SplObjectStorage;
}

function attach(Observer $observer) {
    $this->_observers[$observer] = $observer;
}

function detach(Observer $observer){
    unset($this->_observers[$observer]);
}
    

要回复问题请先登录注册