phpninjas/observable 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

phpninjas/observable

最新稳定版本:v0.1.2

Composer 安装命令:

composer require phpninjas/observable

包简介

Notifier trait for making objects listenable.

README 文档

README

Most modern php frameworks are migrating toward event and message based paradigms. This library goes some way to solving the problem of event object contracts between producers and subscribers.

Installation

Get Composer

curl -sS https://getcomposer.org/installer | php
php composer.phar install

composer.json

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

Example

Use the notifier in your class.

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();

Caveats

The notifier doesn't accept more than 1 argument to be notified of. This forces people to encapsulate their messages better, i.e. if you want to pass more than 1 piece of data encapsulate it in another object

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!
});

Bear in mind non-typesafe observers will receive EVERYTHING, If you add an observer with no typed parameter definition (i.e. the argument is not of a class Type) it will get ALL event messages.

Dragons

Recursive events are bad! Don't do it. i.e. don't have an observer send the same event it just received to the same producer

// 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();

Performance

The performance is roughly 50% faster than Symfony Dispatcher.

In a 2million event based test, Symfony event dispatcher took 37 seconds, while Notifier took 22 seconds (OSX 10.9.5, 2.3Ghz Intel I7, 16GB mem PHP 5.4.30).

统计信息

  • 总下载量: 857
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: Apache
  • 更新时间: 2014-12-10