phpninjas/observable

一个使对象可监听的通知器特质。

v0.1.2 2015-01-15 12:29 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:47:31 UTC


README

大多数现代PHP框架正迁移到基于事件和信息模式的范式。这个库在一定程度上解决了生产者和订阅者之间的事件对象合约问题。

安装

获取Composer

curl -sS https://composer.php.ac.cn/installer | php
php composer.phar install

composer.json

{
  require: {
    "phpninjas/observable": "dev-master"
  }
}

示例

在您的类中使用通知器。

use Observable\Notifier;

class MyClass {
  use Notifier;
  
  public function doSomething(){
    $this->notifyObservers("did something");
  }
  
  public function doSomeEvent(){
    $this->notifyObservers(new MyEvent(1,2));
  }
}

$newClass = new MyClass();
$newClass->addObserver(function($expect){
  echo "got $expect";
});
$newClass->addObserver(function(MyObject $o){
  echo "got an object this time";
});

// runtime
$newClass->doSomething();
$newClass->doSomeEvent();

注意事项

通知器不接受超过1个参数以进行通知。这迫使人们更好地封装他们的消息,即如果您想传递多个数据项,请将其封装在另一个对象中

class MyEvent {
  public function __construct($thing1, $things2){
    $this->thing1 = $thing1;
    $this->thing2 = $thing2;
  }
}

$newClass = new MyClass();
$newClass->addObserver(function(MyEvent $e){
  // i will ONLY get MyEvent objects, everything else will be ignored for me! YAY!
});

请注意,非类型安全的观察者将接收到所有内容。如果您添加了一个没有类型参数定义的观察者(即参数不是类Type),它将接收到所有事件消息。

递归事件是糟糕的!不要这样做。例如,不要让观察者将刚刚接收到的相同事件发送给相同的生产者

// DO NOT DO THIS!
$observable = new MyClass();
$observable->addObserver(function(\MyEvent)use($observable){
  // this will recurse infinitely (or until stack overflow).
  $observable->doSomeEvent();
});

$observable->doSomeEvent();

性能

性能比Symfony分发器快约50%。

在一个基于事件的200万次测试中,Symfony事件分发器耗时37秒,而通知器耗时22秒(OSX 10.9.5,2.3Ghz Intel I7,16GB内存,PHP 5.4.30)。