逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。
先看下监听类:
class Event
{
/**
* 监听列表
* @var array
*/
protected static $listens = [];
/**
* 事件监听
* @param $event
* @param $callback
* @param bool $once
* @return bool
*/
public static function listen($event, $callback, $once = false)
{
//检查是否可以调用
if (is_callable($callback) == false)
{
return false;
}
self::$listens[$event][] = [
'once' => $once,
'callback' => $callback
];
return true;
}
/**
* 事件移除
* @param $event
* @param null $index
*/
public static function remove($event, $index = null)
{
if ($index == null)
{
unset(self::$listens[$event]);
}
else
{
unset(self::$listens[$event][$index]);
}
}
/**
* 事件触发
*/
public static function trigger()
{
//提取参数和事件
$args = func_get_args();
if ($args == false)
{
return;
}
//获取事件
$event = array_shift($args);
$events = self::$listens;
if (isset($events[$event]) == false || $events == false)
{
return;
}
//循环调用
foreach ($events[$event] as $key => $item)
{
$callback = $item['callback'];
$item['once'] && self::remove($event, $key);
call_user_func_array($callback, $args);
}
}
}再看下使用代码:
/**
* 监听select事件
*/
Event::listen('select', function ($sql) {
echo "DB:select():" . $sql . PHP_EOL;
});
/**
* 监听update
*/
Event::listen('update', function ($sql) {
echo "DB:update():" . $sql . PHP_EOL;
}, true);
/**
* 触发select事件
*/
$sql = 'select * from member';
Event::trigger('select', $sql);
Event::trigger('select', $sql);
Event::trigger('select', $sql);
/**
* 触发update事件
*/
$sql = 'update member set age=16';
Event::trigger('update', $sql);
Event::trigger('update', $sql);监听普通事件,可多次触发事件,如果监听我一次性事件,只能单次调用
php调用Webservice基本语法如下:$url ='xxxxxxx.cn' //链接服务器端 $client = new SoapClient($url);通过以上语法已经连接到webservice,也可将wsdl在本地使用,...
在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...
php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{ "require": { &...
最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...