如何在PHP中实现具有全局范围和持久性的Observer模式


How to implement Observer Pattern in PHP with global scope and persistance

我的目标的基本思想是:

  1. 用户A通过表单向submit.php提交值
  2. 用户B监视提交的值,该值通过updates.php推送的服务器发送事件进行更新

submit.php处理将新值写入数据库,以及通知updates.php中的观察者对象。

混淆点:

  1. updates.php的每个实例(会话)是否都需要自己的观察者,因为每个查看更新的用户都将运行自己的脚本实例,或者他们是否都可以共享同一个全局观察者对象?

  2. 当Subject对象加载时,它将在哪里获得观察者对象?我不能储存/让观察者入睡,因为他们是活跃的,对吧?

  3. 如果我使用ObjectStorage对象,当submit.php被调用并获取它时,它们实际上是观察者对象吗?

  4. 每次提交表单时,我如何从submit.php存储/检索ObjectStorage对象?显然我不能使用会话,对吧?就像每个用户一样?

简短版本:有没有一种方法可以获得一个全局的、持久的对象,其中包含主体侧的观察者,而观察者是活动对象?

如果这个想法有更好或更简单的方法(或者如果我只是完全困惑,需要教育),请告诉我。但我并不是在寻找一个已经可以做到这一切的框架,因为我正试图利用这个项目来更好地理解观察者模式。

在解释之前需要记住的一个重要注意事项:

设计模式是为解决特定语言相关问题(限制)而创建的解决方案。它们不是语言级别的软件体系结构中的设计经验法则。

我不确定你如何看到观察者模式,但我会尽力帮助你:

  1. 没有。会话在您的案例中意味着用户实例。您应该以某种方式使用单个抽象观察器来处理所有更新实例。全局观察者对象是前进的道路;

  2. 是的,它们是活动对象,因为观察者向主体注册。在某个时刻,你将不得不拦截他们;

  3. 每当主题发生变化时,它都会向所有注册的观察者广播它已经发生了变化,每个观察者都会向主题查询它负责监控的主题状态的子集。我想你可以从中了解到这一点;

  4. 这实际上是关于实现设计的。没有具体的方法。你可以试着看看什么更适合你;

基本上,是的,你可以有一个全局Observer对象,但这并不是模式的真正意义。

试着阅读Observer模式的实现,看看这是否对你有帮助。

我建议您调查socket.io.