php - php中事件的含义

标签 php events event-handling

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

最佳答案

首先,PHP中没有事件

事件是回调函数及其名称的抽象。 通常,我们将它们定义为 $eventName => $listener ,其中$listener$eventName 的回调函数

事件和常规回调函数有什么区别?

再次强调 - 要记住的核心点是事件是回调函数。仅此而已。

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

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) 有不同类型的逻辑 - 模板逻辑、业务逻辑、错误处理程序逻辑、数据访问逻辑等。事件通过解耦业务(或其他类型)逻辑来简化您的应用程序逻辑从其配置逻辑,以便您最终获得清晰的应用程序逻辑。

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/

相关文章:

php - preg_match 解析html标签并插入变量

javascript - e.screenY 给出错误的值(鼠标坐标)

java - 使用泛型来处理事件

java - JSF ValueChangeListener 不工作

vb.net - VB.NET 中同一事件的多个事件处理程序

javascript - React 事件处理程序按钮单击在第一次单击时不起作用

php - 从闭包中调用 protected __construct... 在 5.4.14 中有效,但在 5.3 中无效?

php - 如何为已安装的 Ubuntu LAMP 堆栈启用 cURL?

php - 使用 Pgsql 驱动程序从 Laravel 5 连接到 Redshift 数据库?

javascript - 通过 sdk/system/events 测试 http-on-modify-request 观察者?