事件在php中的意义

事件在php中的意义,php,events,event-handling,Php,Events,Event Handling,我也知道php和nodejs,在javascript中我们有异步编程,所以我理解其中事件的含义。但我在Yii和Zend 2中看到了事件,也使用了它们,但我不理解它的含义,它在php中是如何工作的,以及它到底做了什么?本文帮助我理解了ZF2中的EventManager: 事件管理器是框架的组件,它允许您连接到应用程序中的命名事件 框架中存在一组现有的命名事件,例如控制器中的dispatch事件。您还可以根据应用程序的用途创建自己的应用程序。这是第一步。 然后,您附加(或收听)这些事件。当它们触发或

我也知道php和nodejs,在javascript中我们有异步编程,所以我理解其中事件的含义。但我在Yii和Zend 2中看到了事件,也使用了它们,但我不理解它的含义,它在php中是如何工作的,以及它到底做了什么?

本文帮助我理解了ZF2中的EventManager:

事件管理器是框架的组件,它允许您连接到应用程序中的命名事件

框架中存在一组现有的命名事件,例如控制器中的dispatch事件。您还可以根据应用程序的用途创建自己的应用程序。这是第一步。 然后,您附加(或收听)这些事件。当它们触发或被触发时,您的代码会询问事件的上下文,并在需要时做出响应

参考资料:

首先,PHP中没有任何事件 事件是具有名称的回调函数的抽象。 通常,我们将它们定义为
$eventName=>$listener
,其中
$listener
$eventName
的回调函数

事件和常规回调函数之间有什么区别? 同样,要记住的核心点是,事件是回调函数。没别的了

它们之间唯一的区别是我们如何调用它们

事件是在引导步骤上定义的,带有必需的参数,但按需调用时不带参数。而回调函数是使用参数和

以这个例子来说,

<?php

$eventManager = new EventManager();
$eventManager->attach('my_event', function(){

   print_r(func_get_args());

}, array('foo', 'bar'));
因为在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\u处理器本身看起来像

  $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) 事件提高了可读性,这对未来很有好处

2) 事件确实遵循了单一责任原则,因为您可以简单地将
$eventManager
注入到需要它的类中,而回调函数可能会破坏它或引入全局状态(这对单元测试不利)

3) 有不同类型的逻辑-模板逻辑、业务逻辑、错误处理程序逻辑、数据访问逻辑等。事件通过将业务(或其他类型)逻辑与其配置逻辑分离,简化了应用程序逻辑,从而使您最终拥有清晰的应用程序逻辑

如果你想知道它们在Zend Framework 2中是如何工作的,你可以看这个(即使你不熟悉Zend Framework 2,也可以看)

MVC相关架构中的事件

既然您一直在谈论框架,那么就没有什么值得一提的了,
MVC相关的
体系结构中也可能存在事件。由于事件是回调函数,您可以在类似MVC的体系结构中抽象常见的
boostrap
事件,如下所示

$mvcEvent->on(MVC_EVENT::ROUTE_MATCH, function(){

  $mvcEvent->on(MVC_EVENT::DISTPATCH, function($content){

    echo $mvcEvent->trigger(MVC_EVENT::RENDER, $content);

  });

});

注意:在纯MVC理论中,根本没有事件。它们确实起到了帮助的作用,但同样,在框架中,你可以将它们抽象出来并称之为“事件”。

在框架中使用它非常简单,我在不知道实际做了什么的情况下使用它们。一个简单的
脚本如何有用?它与PHP无关,这是一个由这些框架实现的事件系统。我还想知道答案,任何人都可以详细解释,它的用途是什么。在这个时代,虽然本质上很复杂,但观测者将离开
$mvcEvent->on(MVC_EVENT::ROUTE_MATCH, function(){

  $mvcEvent->on(MVC_EVENT::DISTPATCH, function($content){

    echo $mvcEvent->trigger(MVC_EVENT::RENDER, $content);

  });

});