当前位置: 首页 > 面试题库 >

PHP Event-Listener最佳实践实现

贺宏富
2023-03-14
问题内容

我正在尝试在PHP中创建类似CMS的系统。使它尽可能模块化和可扩展。

有人可以为我提供在PHP中创建事件侦听器系统(例如Drupal系统的非常简化的版本),创建钩子并在一个简短的示例中实现它们的最佳实践方案也很不错。


问题答案:

嗯,从实现角度看,确实有三种不同的方法可以做到这一点(请注意,这些是面向对象的设计模式,但是您可以根据需要在功能上或过程上实现它们)。

1.观察者模式

您可以实现观察者模式。基本上,您会将可以引发事件的所有事情作为主题。然后,您要侦听的类/代码将绑定到其要侦听的内容。假设您有一个名为的控制器Foo。如果您想听,可以致电$fooController->attach($observer);。然后,无论何时控制器想要说些什么,它都会将事件分派给所有观察者。

这确实非常适合于通知系统(以扩展类的功能)。它不太适合实时修改代码的行为。

2.装饰器模式
您还可以实现装饰器模式。基本上,您将要修改的对象放入“对象”,然后将其“包装”到一个您要更改的新对象中。这确实非常适合于修改和扩展行为(因为您可以从包装的类中选择性地覆盖功能)。

如果您已定义接口并期望对象符合它们,那么这将非常有效。如果您没有接口(或没有正确使用它们),那么装饰器模式可以为您做的大部分事情都会丢失。

还要注意,这实际上不是做事件的方式,而是修改对象行为的方式。

3.中介者模式

您也可以使用调解器。基本上,您将有一个全球调解员来跟踪您的听众。当您想触发事件时,可以将事件发送给调解器。然后,调解员可以跟踪哪些侦听对象想要接收该事件,并正确传递消息。

这具有居中的优势。意味着多个发件人可以发送相同的事件,而发送给侦听器的发送者却没有区别…



 类似资料:
  • 这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们

  • 处理后台任务与常规调用方法有很大的不同。本指南旨在帮助让您的后台任务平稳有效地运行。本文基于 这篇博客文章。 使任务参数小而简单 方法(任务)在调用之前会被序列化。使用 TypeConverter 类将参数转换为 JSON 字符串。如果您有复杂的实体和 / 或大对象; 包括数组,最好将它们放入数据库,然后只将其标识 (id) 传递给后台任务。 错误例子: public void Method(En

  • VR设计 VR设计不同于平面体验设计。作为一种新的媒介,有新的最佳实践需要遵循,特别是保持用户的舒适性和存在性。这在如下指南中已经写得很透彻了: Oculus VR最佳实践 Leap Motion VR最佳实践指南 一些值得注意的事情: 公共的金科玉律是永远不要意外地把相机控制权从用户手中剥夺。 单位(比如对于位置)应该考虑使用米(m)。这是因为WebVR API以米为单位返回姿势数据,进而传送给

  • 本章文档将阐述一些使用herosphp开发一些常用模块的一些比较好的实践。 未完待续。。。

  • 适当的使用vuex 能不用就不用。 能用就用。 不要为了使用而使用,一个小方法里面有5个设计模式。 不要过度使用CSS框架 因为CSS框架一般会大幅度增加文件体积。 例如 bootstrap, ele.me前端框架。 这个在低端安卓机上影响显著。 使用CDN来存放js, css, 和图片文件。 灵活使用第三方Vue 插件 例如: 轮播图, 表单验证等等。这些轮子都是现成的。 前端逻辑务必简单 能在

  • 这是 Martin Zinkevich (Google) 在 NIPS 2016 Workshop 分享的谷歌机器学习最佳实践翻译版,PDF 全文见 Rules of Machine Learning: Best Practices for ML Engineering。 机器学习产品所要面对的难题是工程问题(而不是 ML 算法),所以在做机器学习时要遵循跟其他产品类似的工程原则。 术语 实例(