PHP事件代码案例,减少系统耦合,一处代码多处应用

通常在PHP开发中,为了减轻代码的重复率,我们通常相同功能单独写。

<?php
class Event{
	//事件池
	protected static $listens = array();
	
	/**
	 * 监听事件
	 * @param string $event 事件名称
	 * @param object|function $callback 事件主题逻辑
	 * @param boolen $once 是否执行一次就清除事件
	 * @return type
	 */
	public static function listen($event,$callback,$once=false){
		//如果事件逻辑不能被调用
		if(!is_callable($callback)) return false;
		//设置事件
		self::$listens[$event][] = ['callback'=>$callback,'once'=>$once];
		return true;
	}
	
	public static function trigger(){
		//没有参数就退出
		if(!func_get_args())return;
		// 事件名的数组
        $args  = func_get_args(); 
		// 将函数名(callback)赋给 $event
        $event = array_shift($args);
        // 检测事件是否被注册过,没有则退出
        if(!isset(self::$listens[$event])) return false; 
        foreach(self::$listens[$event] as $index=>$listen){ 
            $callback = $listen['callback'];
            call_user_func_array($callback, $args); 
			if($listen['once']){
				unset(self::$listens[$event][$index]);
				if(count(self::$listens[$event])<=0){
					unset(self::$listens[$event]); 
				}
			}
        }
	}
}

class sms{
	public function sendSms($code){
		echo "发送短信:注册成功".$code."<br>";
	}
}
class email{
	public function sendEmail($code){
		echo "发送邮件:注册成功".$code."<br>";
	}
}

//用户注册成功

//下面发送通知信息

//监听事件
$sms = new sms();
Event::listen('zhuce', [$sms,'sendSms'],true);
//监听事件
$email = new email();
Event::listen('zhuce', [$email,'sendEmail'],true);
//触发事件
Event::trigger('zhuce','20190214');


文 / Admin
评论
  1. 2019-03-08
    梦想

    听说不能留言的

  2. 2019-03-16
    小石

    每篇文章都有音乐,有点精致啵

  3. 2019-07-17
    Aries

    test

金玉良言
loading