遊戲中經常用到事件,這裏模仿一個。直接 上代碼
<?php
namespace event;
//是否開啓匹配模式
// if(function_exists('FNMATCH')){
// define('FNMATCH',true);
// }else{
// define('FNMATCH',false);
// }
class EventEmmitter{
// public static $instance = null;
// /**
// *
// * @return EventManager
// */
// public static function getInstance()
// {
// if (!self::$instance) {
// self::$instance = new self();
// }
// return self::$instance;
// }
/**
* @var array
*/
protected $listeners = array();
/**
* fire event
* @param string $event
* @param mixed $args
* @return int 觸發次數
*/
public function emit($event,$dataArr){
$tempListeners = array();
//刪除一次性的
$emittedCount = 0;
// print_r($this->listeners[$event]);
foreach($this->listeners[$event] as $name => $listener){
//一次性
if(1 == $listener['isOnce']){
}else{
$tempListeners[] = $listener;
}
// print_r($listener);
//調用函數
call_user_func($listener['callback'],$dataArr);
++$emittedCount;
}
$this->listeners[$event] = $tempListeners;
return $emittedCount;
}
/**
* attach a event listener
* @param string $event
* @param callback
*/
public function on($event, $callback){
if(!isset($this->listeners[$event])){
$this->listeners[$event] = array();
}
$listener = array(
'isOnce'=>0,//不是一次性
'callback'=>$callback,
);
// print_r($listener);
array_push($this->listeners[$event], $listener);
}
/**
* attach a event listener once
* @param string $event
* @param callback
*/
public function once($event, $callback){
if(!isset($this->listeners[$event])){
$this->listeners[$event] = array();
}
$listener = array(
'isOnce'=>1,//一次性
'callback'=>$callback,
);
// print_r($listener);
array_push($this->listeners[$event], $listener);
}
/**
* turn off event
*/
public function off($event){
if(isset($this->listeners[$event])){
unset($this->listeners[$event]);
}
}
/**
* remove all event
*/
public function removeAll(){
$this->listeners = array();
}
/**
* get listener
*/
public function getListener(){
return $this->listeners;
}
}
測試代碼
<?php
require_once "eventEmitter.php";
use event\EventEmmitter;
class Room{
public function userInhome($data){
print_r("class Room event userInhome data:".$data.PHP_EOL);
}
public function __invoke($data){
print_r("class Room event __invoke data:".$data.PHP_EOL);
}
public static function roomInfo($data){
print_r("class Room event roomInfo data:".$data.PHP_EOL);
}
public function userOutHome($data){
print_r("class Room event userOutHome data:".$data.PHP_EOL);
}
}
function messageEvent1($data){
print_r("messageEvent1 data:".$data.PHP_EOL);
}
function messageEvent2($data){
print_r("messageEvent2 data:".$data.PHP_EOL);
}
$eventManger = new EventEmmitter();
$room = new Room();
// $room->userInhome("before");
// $eventManger->on("test",call_user_func(array($room,"userInhome")));
$eventManger->on("test",array($room,"userInhome"));
$eventManger->on("test",array($room,"userOutHome"));
$eventManger->on("test","Room::roomInfo");
$eventManger->on("test",'messageEvent1');
$eventManger->once("test",'messageEvent2');
$clourse1 = function($data){
print_r("clourse1 data:".$data.PHP_EOL);
};
$clourse2 = function($data){
print_r("clourse2 data:".$data.PHP_EOL);
};
$eventManger->on("test",$clourse1);
$eventManger->once("test",$clourse2);
$eventManger->emit("test"," first");
$eventManger->emit("test"," second");