起因

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的事件处理机制(回调函数)相关推荐

  1. Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现

    文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...

  2. 事件争夺战 Android事件处理机制与原理分析

    事件争夺战 Android事件处理机制与原理分析 文章目录 事件争夺战 Android事件处理机制与原理分析 View的继承关系 View的事件处理源码 总结: ViewGroup的事件分发源码 总结 ...

  3. nodejs-REPL/回调函数/事件循环

    REPL 回调函数 事件循环REPL----------------------------------------------------- Node.js REPL(Read Eval Print ...

  4. delphi 回调函数

    "回调机制"是window 在执行某个API函数的过程中,调用指定的一个函数(回调函数). 比如:你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它 ...

  5. OPENCV回调函数

    OPENCV回调函数 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...

  6. 【C/C 】浅谈C/C 中函数指针与回调函数

    01.函数指针 1.1.函数指针定义 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予 ...

  7. python gui button回调函数运行完成后弹出窗口_嵌入式设备GUI开发之GTK+入门(一)...

    小伙伴们大家好,最近鑫哥带领大家做了很多的C语言的小项目,那有些小伙伴说我们可以用python做图形界面,我们可以使用C语言做吗? 我的回答是当然没问题嘻嘻,接下来鑫哥就带大家一起去看看如何进行GTK ...

  8. 回调函数(CALLBACK)学习总结

    回调函数应该和设计相关而不是和语言相关. 在分层设计中,高层次的模块会叫低层次的模块做一些事情,通常是通过函数调用.  从设计上来说,低层次的模块不应该直接调用高层次模块的函数. 所以高层次模块在叫低 ...

  9. 我的C++回调函数的理解

    今天在看一个多线程下载文件的代码时,让我很头痛.因为该程序中运用了大量的回调函数. 在我们学习一种技术的时候我们就要去知道几个问题 1.        回调函数是什么东西? 2.        回调函 ...

最新文章

  1. 是男人就下100层【第五层】——2048游戏从源代码到公布市场
  2. 字符串操作(Java)
  3. Teamviewer连接服务器显示不能够全屏 或 向日葵连接服务器不能够全屏 或 Teamviewer只显示一个640x480的分辨率选项
  4. mysql管理员操作
  5. 洛谷2766:[网络流24题]最长不下降子序列问题——题解
  6. List list= new ArrayList为什么这样写 接口引用指向实现类的对象
  7. x64dbg 搜索多条指令 ( find sequence of commands )
  8. Simulink中DPCM量化和编码仿真
  9. 项目中使用EasyPOI完成监控设备历史数据的导出
  10. 一个好看的网站关站维护通告单页
  11. Algorithm:十大经典排序算法C++实现及总结
  12. 在Windows 7 专业版 SP1安装多语言包的办法 摘录
  13. java 反射 静态成员_java 利用反射获取内部类静态成员变量的值
  14. Socket教程(完全版)
  15. 华为鸿蒙手机系统什么时候开始更新_华为鸿蒙系统2.0什么时候可以升级
  16. NanoMsg框架|Android的各模式通讯封装(不另编译动态库附DEMO地址)
  17. 控件(五)——Gridview控件以SqlDataSource控件为数据源实现换肤功能
  18. c语言程序图像抠图,Opencv使用鼠标任意形状的抠图
  19. Gluster的配置及离线安装
  20. 怎样给黑白照片上色?手把手教你上色

热门文章

  1. 记《浪潮之巅》《硅谷之谜》《智能时代》
  2. 业务和商业才是技术的驱动力
  3. XAI Explainable AI 模型可解释性(3)
  4. Matlab绘图技巧--如何去除图上方和右方刻度
  5. jquery清空某个元素下的所有节点
  6. 单片机应用系统设计技术——数控云台master
  7. Linux无法账号密码登录问题
  8. 金融机构的IT团队前置
  9. 静态工厂方法优缺点个人理解
  10. 阿里云PAI平台模型压缩技术落地淘宝直播双十一应用:一猜到底