PHP Event-Listener最佳实践实施

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

有人能给我提供一个在PHP中创build一个事件监听器系统(例如Drupal系统的一个非常简化的版本)的最佳实践场景,创build钩子并在一个简短的例子中实现它们也是很好的。

那么,从实现的angular度来看,实际上有三种不同的方式(请注意,这些是面向对象的devise模式,但是如果您愿意,可以在function上或程序上实现它们)。

1.观察者模式

您可以实现观察者模式 。 基本上,每件事都可以引发事件成为一个主题。 然后,你想要听的类/代码绑定到具体要听的内容。 假设你有一个名为Foo的控制器。 如果你想听,你可以调用$fooController->attach($observer); 。 然后,每当pipe制员想说点什么的时候,都会把事件发给所有的观察者。

这真的非常适合通知系统(扩展什么类正在做)。 它不适合实时修改代码的行为。

2.装饰模式你也可以实现装饰模式 。 基本上,你把你想要修改的对象,并“包装”在一个新的对象,你想要改变。 这非常适合修改和扩展行为(因为您可以有select地从被包装的类中覆盖function)。

如果你已经定义了接口并且希望对象符合它们,这个效果非常好。 如果你没有接口(或没有正确使用它们),装饰器模式可以为你做的大部分将会丢失。

另外请注意,这实际上不是做事件的一种方式,它是修改对象行为的一种方式。

3.调解员模式

你也可以使用调解员 。 基本上,你会有一个全球调解人,跟踪你的听众。 当你想触发一个事件,你发送事件中介。 调解员可以跟踪哪些侦听对象想要接收该事件,并正确传递消息。

这有中央的优势。 这意味着多个发送者可以发送相同的事件,而对于听众来说,发送它的人没有什么区别。

我在博客文章中扩展了这个主题。

发现这个,非常简单,非常好。

 /* Example 1: event::bind('blog.post.create', function($args = array()) { mail('myself@me.com', 'Blog Post Published', $args['name'] . ' has been published'); }); Example 2: event::trigger('blog.post.create', $postInfo); */ class event { public static $events = array(); public static function trigger($event, $args = array()) { if(isset(self::$events[$event])) { foreach(self::$events[$event] as $func) { call_user_func($func, $args); } } } public static function bind($event, Closure $func) { self::$events[$event][] = $func; } } 

这是我在几个项目中做到的

所有的对象都是用一个构造函数而不是new操作符来创build的。

  $obj = _new('SomeClass', $x, $y); // instead of $obj = new SomeClass($x, $y); 

与原始的new相比,这有许多优点,从事件处理的angular度来说, _new()维护一个所有创build对象的列表是很重要的。

还有一个全局函数send($message, $params)遍历这个列表,如果一个对象公开了一个方法“on_ $ message”,就调用这个方法,传入params:

 function send() { $_ = func_get_args(); $m = "on_" . array_shift($_); foreach($_all_objects as $obj) if(method_exists($obj, $m)) call_user_func_array(array($obj, $m), $_); } 

所以,例如, send('load')将为每个定义了它的对象调用on_load方法。

如果您使用的是PHP 5.3(因此可以访问丰富的闭包),则Lithium中的事件/filter系统就是我在PHP中使用AOPdevise的基础。

不知道为什么PHP的人认为他们从听众那里获得任何东西。 简单的问题:如果我正在寻找PHP开发人员,我只问1个问题:MVC的问题和局限性是什么?

如果你不能回答这个问题,你就不应该考虑实现监听器或者实现一个框架。

下一个知道你的语言。 PHP是单线程,单个构build。 含义内存和对象是线程特定的。 因此,Java / C#中的监听器和其他保持活着的对象不应该在php中使用,因为它们往往会花费巨大的代价来构build和复杂化应用程序,而没有获得足够的价值来certificate它们的合理性。

不支持框架,从2年前开始,PHP的领导者表示他们不打算支持Frameworks for PHP。 这意味着要获得一个与PEAR原生PHP一样好的框架,你必须实现几十个附加内存,使得开发变得复杂,代码混淆没有任何好处。

与大多数PHP框架相比,标准PHP开发更快,更容易使用。 有几个PEAR库可以帮助你完成任务。 不要试图成为一个单线程系统上的multithreading开发人员,它不是真正的价值。

如果您需要进行线程间通信,请放弃PHP并使用multithreading语言进行开发。

因为BUZZ字样,不要使用技术。 MVC被过度使用,99%的时间被滥用。 结果从慢系统到糟糕的数据结构/validation。 听众是一样的,知道它是什么之前,你使用它。

我以前的第一个问题是怎么样的? 应该是为什么我应该? 知道你的技术,趋势教坏习惯和蹩脚的开发人员。

对不起,肥皂箱已经结束了,只是厌倦了运行该工厂的PHP开发人员鹦鹉可以在没有思考的情况下find答案和意识形态。 这就是为什么Java开发人员取笑PHP开发人员的原因,因为他们正在尝试使用他们的语言不是为了devise的技术,创build者说他不打算支持。

那里有很棒的PHP开发人员,而不是那些试图使用像Zend Framework这样的紧密框架,或者像域控制器或者监听器这样的技术。

Interesting Posts