逛公众号文章看到文章"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验证码不显示的问题应该是经常的事情,我在这里把2种解决方案都发出来方便大家后期使用.因为是昨天晚上自己写验证码都没有显示,我就直接把之前和李炎恢老师上课写的验证码拿来还是不显示,醉了。首先是第一种方法:1、打开服务器安装目录下的php.ini文件;2、去掉;extension=php_gd.d...
应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...
参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...
最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...
<?php /** * daemonize让当前脚本为守护进程执行 * @param string $callback 匿名函数 */ function daemonize($callback) {...