我也了解php和nodejs,在javascript中我们有异步编程,所以我理解其中事件的含义。但是我看到Yii和Zend 2中的事件并且也使用它们,但是我可以不明白它的含义,它在 php 中是如何工作的以及它到底有什么作用?
最佳答案
首先,PHP中没有事件
事件是回调函数及其名称的抽象。
通常,我们将它们定义为 $eventName => $listener
,其中$listener
是 $eventName
的回调函数
事件和常规回调函数有什么区别?
再次强调 - 要记住的核心点是事件是回调函数。仅此而已。
它们之间的唯一区别是我们如何调用它们。
block 引用>An event is defined on bootstrap step with its required arguments, but invoked on demand without arguments. While the callback function is invoked with arguments and only
考虑这个例子,
<?php $eventManager = new EventManager(); $eventManager->attach('my_event', function(){ print_r(func_get_args()); }, array('foo', 'bar'));
由于我们刚刚定义了一个事件,因此我们会调用,
$eventManager->trigger('my_event');
这将输出:
Array([0] => [foo], [1] => [bar]
这与 JavaScript 有关!
由于我们大多数人都熟悉 JavaScript 偶数驱动架构,因此无需提及其常见用法的示例:
var a = document.getElementsByTagName('a')[0]; a.onclick = function(event) { // <-- We define an event with the event argument event.preventDefault(); alert('A element was clicked'); } a.click(); // <-- but we invoke it without arguments // or If you want a Jquery $("a").click(function(event){ event.preventDefault(); alert('A element was clicked'); }); $("a").click();
由于在 PHP 中我们没有这种事件驱动的性质,因此我们可以将其替换为我们自己的类来管理事件并充分利用它。
为什么使用它们?
虽然事件让很多人感到困惑,但它们非常有用。
假设您有一个内容管理系统 (CMS),您的用户可以在其中决定如何处理
404
错误。比如说,他们可以处理1) 显示空白页
2) 重定向至/
3) 显示自定义消息如果没有事件,你就必须这样做,例如
if ($router->isMatched($request)){ //do dispatch etc } else { // Here you start handling 404 errors switch($config->read('404_way_handle')){ case 'show_blank': die(); break; case 'show_msg': echo 'Some custom message'; break; case 'redirect': // do redirect break; } }
通过事件,您可以简化可读性并使代码更易于维护:
if ($router->isMatched($request)){ // do dispatch } else { $eventManager->trigger('404_handler'); }
同时
404_handler
本身看起来像$eventManager->attach('404_handler', function(){ switch($config->read('404_way_handle')){ case 'show_blank': die(); break; case 'show_msg': echo 'Some custom message'; break; case 'redirect': // do redirect break; } }, $config);
那么让我们来分解一下
1) 事件提高了可读性,这对 future 非常有利
2) 事件确实遵守单一职责原则,因为您可以简单地注入(inject)
$eventManager
到需要它的类,而回调函数可能会破坏它或者也可能引入全局状态(这对单元测试不利)。3) 有不同类型的逻辑 - 模板逻辑、业务逻辑、错误处理程序逻辑、数据访问逻辑等。事件通过解耦业务(或其他类型)逻辑来简化您的应用程序逻辑从其配置逻辑,以便您最终获得清晰的应用程序逻辑。
block 引用>You can watch this lecture if you want to know how they do work in Zend Framework 2 (watch it even if you're not familiar with Zend Framework 2)
MVC相关架构中的事件
既然你一直在谈论框架,那么就不用提了,
MVC-related
中可能存在事件。架构也是如此。由于事件是回调函数,您可以抽象公共(public)boostrap
类 MVC 架构中的事件,如下所示。$mvcEvent->on(MVC_EVENT::ROUTE_MATCH, function(){ $mvcEvent->on(MVC_EVENT::DISTPATCH, function($content){ echo $mvcEvent->trigger(MVC_EVENT::RENDER, $content); }); });
注意:在纯 MVC 理论中,根本不存在事件。它们确实充当助手,但同样 - 在框架中,您可以将它们抽象并称为“事件”。
关于php - php中事件的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17377442/