【问题标题】:Objects to strings, unique keys in PHP对象到字符串,PHP 中的唯一键
【发布时间】:2011-09-15 15:54:25
【问题描述】:

我正在阅读有关观察者模式的信息,发现了一个过时的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,我认为这可能是我的最佳选择,但请随时分享您的想法。

【问题讨论】:

  • 你刚刚发现还是马里奥刚刚告诉你呢? :P
  • spl_object_hash 在概念上被破坏了(为不同的对象返回相同的哈希值),但在使用时通常不会遇到问题。
  • @yes123:找到并正在编辑。已保存的编辑,并出现了答案。
  • @hakre: 是否返回相同的哈希值?
  • 有趣的注释:根据php.net/manual/en/function.spl-object-hash.php#76220给定的内部结构没有改变)它对内部句柄进行哈希处理。当第一个对象被销毁后立即创建相同的对象时,它可以产生相同的哈希值。

标签: php serialization object hash unique-key


【解决方案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)]);
}

基于序列化的方法有一个设计问题顺便说一句:当对象的值相同时,或者换句话说,如果对象返回相同的序列化值,例如,我停止工作。空值。当对象实现Serializable interface时,这完全可以由对象本身控制。

【讨论】:

  • 谢谢hakre;找到spl_object_hash 并在您回答时正在编辑:) 另外,是的,我知道 Spl 接口;关于对象 ID,观察者模式的提及更像是我的实际问题的容器。感谢您提到序列化问题,我没有想到。
【解决方案2】:

你试过SPL object hash function吗?

【讨论】:

  • 谢谢罗宾;刚刚找到它:)
【解决方案3】:

您也可以直接使用SplObjectStorage

喜欢:

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

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

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

【讨论】:

  • 谢谢耀西;惊人的。我会继续使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多