php 事件,php的事件处理机制(回调函数)
起因
js有个事件处理机制,当事件被触发时,调用设置的回调函数。
比如说
$("#div").on('click',function(){
// 代码段
});
那么身为世界上最好的语言,php能做到吗?
答案是肯定的,比如 swoole
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
'worker_num' => 8, //工作进程数量
'daemonize' => true, //是否作为守护进程
));
$serv->on('connect', function ($serv, $fd){
echo "Client:Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, 'Swoole: '.$data);
$serv->close($fd);
});
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
$serv->start();
$app = new Phalcon\Mvc\Micro();
//Retrieves all robots
$app->get('/api/robots', function() {
});
//Searches for robots with $name in their name
$app->get('/api/robots/search/{name}', function($name) {
});
and so on
开始
这种拿php当js用这麽帅气的事情,臣妾做不到啊。
俗话说 内事不决问百度,外事不决问谷哥,
然后度娘告诉了我这个 大神的博文
PHP回调函数的实现方法
大神说了下原理,我想了想写了这麽个东西,
class MyClass{
public $eventMap = array();
function on($evtname , $handle ){ //注册一个事件上的响应回调函数
$this->eventMap[$evtname]=$handle;
}
function trigger($evtname , $scope=null){ //触发一个事件,也就是循环调用所有响应这个事件的回调函数
call_user_func_array( $this->eventMap[$evtname] , $scope);
}
}
里面用了这么个东西 call_user_func_array 官网说明
大神在他的博客里说了三种类型函数的调用方法和传参方法,博客里提到 为了能使用对象的属性,用create_function创建函数,这点我觉得没有必要,如果是调用一个对象的方法,里面用到对象的属性,那么传参数直接将对象传递过来就好。
对此我再说一下 ,本来是这样的
$func = array( '类名','类的方法名' );
$args = array('参数1','参数2') ;
call_user_func_array( $func , $args );
这里面的 $func 都是 字符串 , 当调用的方法里有$this这种东西时,回报错,
那么我建议是这样
$func = array( $object ,'类的方法名' );
$args = array('参数1','参数2') ;
call_user_func_array( $func , $args );
这样就没问题了。
下面看看效果
先来个大众的
$MyClass = new MyClass;
$MyClass->on('post' , function($a , $b ){
echo " a = $a ; \n ";
echo " b = $b ; \n ";
echo " a + b = ".( $a + $b) . ";\r\n ";
} );
$MyClass->trigger('post' , array( 123 , 321 ) );//框架内部触发
举个例子
我们希望根据http的不同请求调用不同的函数来处理;
比如说接收到了post请求,此时就调用post对应的注册函数。
然后是换个类的方法
class test{
static $static = "this is static ";
public $nomal = "this is nomal ";
function demo($a , $b ){
echo " a = $a ;\r\n";
echo " b = $b ;\r\n";
echo " static = ".self::$static." ;\r\n";
echo " nomal = ".$this->nomal." ;\r\n";
echo " add = ".$this->add." ;\r\n";
}
}
接着来
$test = new test;
$test->add = " this is new add ";
$MyClass->on('post' ,array( $test , 'demo' ) );
$MyClass->trigger('post' , array( 123 , 321 ) );
ok , 没有问题。
其实我想到了另一件事情,
有个对象数组 $objects , 我们给每一个对象绑定各自的事件和事件的回调方案,
比如说,小偷来了,我们要打110;朋友来了,我们要请客吃饭。
我不知道实际的项目中有没有这种情景需要,并且暂时没想过怎么处理。
php 事件,php的事件处理机制(回调函数)相关推荐
- Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现
文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...
- 事件争夺战 Android事件处理机制与原理分析
事件争夺战 Android事件处理机制与原理分析 文章目录 事件争夺战 Android事件处理机制与原理分析 View的继承关系 View的事件处理源码 总结: ViewGroup的事件分发源码 总结 ...
- nodejs-REPL/回调函数/事件循环
REPL 回调函数 事件循环REPL----------------------------------------------------- Node.js REPL(Read Eval Print ...
- delphi 回调函数
"回调机制"是window 在执行某个API函数的过程中,调用指定的一个函数(回调函数). 比如:你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它 ...
- OPENCV回调函数
OPENCV回调函数 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...
- 【C/C 】浅谈C/C 中函数指针与回调函数
01.函数指针 1.1.函数指针定义 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予 ...
- python gui button回调函数运行完成后弹出窗口_嵌入式设备GUI开发之GTK+入门(一)...
小伙伴们大家好,最近鑫哥带领大家做了很多的C语言的小项目,那有些小伙伴说我们可以用python做图形界面,我们可以使用C语言做吗? 我的回答是当然没问题嘻嘻,接下来鑫哥就带大家一起去看看如何进行GTK ...
- 回调函数(CALLBACK)学习总结
回调函数应该和设计相关而不是和语言相关. 在分层设计中,高层次的模块会叫低层次的模块做一些事情,通常是通过函数调用. 从设计上来说,低层次的模块不应该直接调用高层次模块的函数. 所以高层次模块在叫低 ...
- 我的C++回调函数的理解
今天在看一个多线程下载文件的代码时,让我很头痛.因为该程序中运用了大量的回调函数. 在我们学习一种技术的时候我们就要去知道几个问题 1. 回调函数是什么东西? 2. 回调函 ...
最新文章
- 是男人就下100层【第五层】——2048游戏从源代码到公布市场
- 字符串操作(Java)
- Teamviewer连接服务器显示不能够全屏 或 向日葵连接服务器不能够全屏 或 Teamviewer只显示一个640x480的分辨率选项
- mysql管理员操作
- 洛谷2766:[网络流24题]最长不下降子序列问题——题解
- List list= new ArrayList为什么这样写 接口引用指向实现类的对象
- x64dbg 搜索多条指令 ( find sequence of commands )
- Simulink中DPCM量化和编码仿真
- 项目中使用EasyPOI完成监控设备历史数据的导出
- 一个好看的网站关站维护通告单页
- Algorithm:十大经典排序算法C++实现及总结
- 在Windows 7 专业版 SP1安装多语言包的办法 摘录
- java 反射 静态成员_java 利用反射获取内部类静态成员变量的值
- Socket教程(完全版)
- 华为鸿蒙手机系统什么时候开始更新_华为鸿蒙系统2.0什么时候可以升级
- NanoMsg框架|Android的各模式通讯封装(不另编译动态库附DEMO地址)
- 控件(五)——Gridview控件以SqlDataSource控件为数据源实现换肤功能
- c语言程序图像抠图,Opencv使用鼠标任意形状的抠图
- Gluster的配置及离线安装
- 怎样给黑白照片上色?手把手教你上色