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

时间:2011-06-15 15:34:32

标签: php serialization object hash unique-key

我正在阅读有关观察者模式的内容,并找到了一个约会article。经过阅读,我注意到这一段中有一个有趣的提及:

  

这里要看的关键方法是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 个答案:

答案 0 :(得分:1)

您是否尝试过SPL object hash function

答案 1 :(得分:1)

你是对的,不再那样了。您可能希望使用其他功能:spl_object_hash()

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

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

基于序列化的方法有一个设计问题btw:当对象按值相同或换句话说,如果对象返回相同的序列化值,例如,空值。在实现Serializable interface时,对象本身完全可以控制它。

答案 2 :(得分:1)

或者,您可以直接使用SplObjectStorage

像:

function __construct(...){
    $this->_observers = new SplObjectStorage;
}

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

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