首页 > 后端开发 > 正文

php 框架 怎么使用回调函数

2024-07-31 07:48:16 | 我爱编程网

今天我爱编程网小编整理了php 框架 怎么使用回调函数相关信息,希望在这方面能够更好帮助到大家。

本文目录一览:

php 框架 怎么使用回调函数

php 框架 怎么使用回调函数

前言
最近在开发一个PHP系统,为了提高系统的扩展性,我想在系统中加入类似Javascript的事件处理机制,例如:我想在一篇新闻被添加以后,我想记录一下日志,用类似Javascript的代码,应该是这样写的:
function fnCallBack( $news )
{
//将$news的信息记录到日志中
writeLog( $news->getTitle().' has been added successfully!');
}
$newsEventManager->addEventListener( 'add' , fnCallBack );
其中,fnCallBack函数是回调函数,addEventListener表示监听newsEventManager的add事件。当一篇news被add以后,系统就会调用fnCallBack函数,从而完成writeLog的动作。
但是,PHP中的函数传递方法和Javascript有很大的不同。在Javascript中,函数也是对象,它可以很方便的当作参数传递,但是PHP不行。
$newsEventManager->addEventListener( 'add' , fnCallBack );
上面这行代码中的fnCallBack,看上去好像是那个函数的句柄,但实质上它是一个字符串,并不是我们所要的函数。
为了实现我们的事件模型,有必要研究一下PHP的回调函数的实现方法。
全局函数的回调
这里的全局函数的意思,是直接使用function定义的函数,它不包含在任何对象或类之中。请看下面的例子
示例代码
function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( $fnName , $params );
代码说明:
这里使用了PHP内置的函数call_user_func_array来进行调用。call_user_func_array有两个参数,第1个参数是一个字符串,表示要调用的函数名,第2个参数是一个数组,表示参数列表,按照顺序依次会传递给要调用的函数。
效果如下:
类的静态方法的回调
如果我们要回调的方法,是一个类的静态方法,那怎么办呢?我们依然可以利用PHP内置的call_user_func_array方法来进行调用,请看示例:
示例代码:
class MyClass
{
public static function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
代码说明:
这段代码和第1种方法的代码很相似,我们将类名(MyClass)也作为call_user_func_array的第1个参数传递进去,就可以实现类的静态方法的回调了。注意,这时call_user_func_array的第1个参数是一个数组了,数组的第1个元素是类名,第二个元素是要调用的函数名
运行结果:
(其实和第1种方法的结果是一样的 ^_^ )
继续研究
如果我用这种方法调用一个类的非静态方法(也就是把static去掉),会出现什么结果呢?请看下面代码
class MyClass
{
public function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
运行结果
和前面的结果还是一样的。。。
现在我为这个类添加一点属性,并在方法中引用
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 , $msg2 )
{
echo 'object name:'.$this->name;
echo "<br />\n";
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
运行结果
出现解析错误,提示$this没有在对象环境下出现,说明这个方法不能用类来调用,而是要用对象来调用。那我们就修改一下代码,创建一个对象:
class MyClass
{
public function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$className = 'myobj';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
运行结果:
提示call_user_func_array的第1个参数非法,也就是说,调用失败。看来我们不能用call_user_func_array方法来回调一个对象的方法了,那么如何实现对象方法的回调的?
对象的方法的回调
我先用最原始的字符串形式的调用方法尝试了一下,如下所示:
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'object name:'.$this->name;
echo "<br />\n";
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
$myobj->$fnName();
成功了,输出结果
调用是成功了,不过如何把参数params传给这个方法呢,如果把params直接传进去,那么它会作为1个参数,怎么把params拆开来传进去呢?
查了下PHP手册,找到了create_function函数,这个方法可以用字符串来创建一个匿名函数,好,有思路了,可以创建一个匿名的函数,在这个匿名函数中,调用我们的回调函数,并把参数传进去。
我先手动创建一个匿名函数anonymous,在这个函数中,用前面试出来的方法调用回调函数,如下所示:
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'object name:'.$this->name;
echo "<br />\n";
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
function anonymous()
{
global $myobj;
global $fnName;
global $params;
$myobj->$fnName( $params[0] , $params[1] );
}
anonymous();
成功了,可以看到,对象的属性name也输出来了
然后,我用create_function来创建这个匿名函数,同时,代码中的params[0],params[1]应该是动态生成的,代码如下:
$strParams = '';
$strCode = 'global $myobj;global $fnName;global $params;$myobj->$fnName(';
for ( $i = 0 ; $i < count( $params ) ; $i ++ )
{
$strParams .= ( '$params['.$i.']' );
if ( $i != count( $params )-1 )
{
$strParams .= ',';
}
}
$strCode = $strCode.$strParams.");";
$anonymous = create_function( '' , $strCode);
$anonymous();
这段代码可以定义一个匿名函数,并保存在$anonymous变量中,最后调用这个$anonymous,实现了方法的回调,如图
PHP事件模型(观察者模式)的实现思路
至此,PHP中的3种常见的函数类型(全局函数,类静态函数,对象的方法)都可以回调了,可以实现文章一开始说的事件模型了 :)
事件模型模仿Firefox的Javascript实现,有3个方法,分别是
addEventListener:注册一个事件上的响应回调函数
removeEventListener:删除一个事件上的响应回调函数
fire:触发一个事件,也就是循环调用所有响应这个事件的回调函数
不过,由于第2、第3种方法需要传递上下文(也就是类名和对象名),所以addEventListener和removeEventListener应该有3个参数,我是这样设计的:
function addEventListener( $evtName , $handler , $scope = null )
第1个参数表示事件名,字符串类型
第2个参数表示回调函数名,字符串类型
第3个参数$scope是上下文环境,一共有3种类型,null表示传入的handler函数是一个全局函数,字符串类型表示传入的handler函数是scope类的静态函数,对象类型表示传入的scope是一个对象,handler函数是对象的一个方法。
function fire( $evtName , $params = null )
这个方法内,会读取出所有响应evtName的handler,然后判断它对应的scope,如果是null,则用本文第1种方法回调,如果是字符串,则用本文第2种方法回调,如果是对象,则用本文第3种方法回调。这样,一个PHP的事件模型就可以实现了,而且可以将回调函数放在某个对象中。

php 框架 怎么使用回调函数

PHP将回调函数作用到给定数组单元的方法

数组是PHP程序设计中十分重要的一环。本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上。具体如下:
array
array_map
(
callable
$callback
,
array
$arr1
[,
array
$...
]
)
array_map()
返回一个数组,该数组包含了
arr1
中的所有单元经过
callback
作用过之后的单元。
callback
接受的参数数目应该和传递给
array_map()
函数的数组数目一致。
示例程序如下:
function
fun($n)
{
return
$n
*
$n
*
$n;
}
$a
=
array(1,
2,
3,
4,
5);
$b
=
array_map('fun',
$a);
/*
每个数组单元作三次方运算,返回数组
*/
print_r($b);
输出结果为:
Array
(
[0]
=>
1
[1]
=>
8
[2]
=>
27
[3]
=>
64
[4]
=>
125
)
此外,array_map()函数还有如下几种用法:
array_map('unlink',
glob('*.txt'));/*
glob返回"文件名.txt"组成的数组,然后对每个文件进行删除操作*/
array_map('unlink',
glob('*.*'));
array_map('unlink',
glob('*'));
如果不使用array_map(),对数组每个单元进行操作就只能遍历然后适当组装。
更多的应用读者可以根据具体的项目需求进行挖掘。

php 框架 怎么使用回调函数我爱编程网

php中的回调函数怎么理解

我爱编程网(https://www.52biancheng.com)小编还为大家带来php中的回调函数怎么理解的相关内容。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
php提供了两个内置函数call_user_func()和call_user_func_array()提供对回调函数的支持。这两个函数的区别是call_user_func_array是以数组的形式接收回调函数的参数的,看它的原型就知道了:mixed call_user_func_array ( callable $callback,array$param_arr ),它只有两个参数。而call_user_func($callback,参数1,参数2,…)的参数个数根据回调函数的参数来确定的。

以上,就是我爱编程网小编给大家带来的php 框架 怎么使用回调函数全部内容,希望对大家有所帮助!更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“php 框架 怎么使用回调函数”相关推荐
java框架有哪些常用框架
java框架有哪些常用框架

java框架有哪些常用框架十大常用框架:一、SpringMVC二、Spring三、Mybatis四、Dubbo五、Maven六、RabbitMQ七、Log4j八、Ehcache九、Redis十、Shiro延展阅读:一、SpringMVCSpringWebMVC是一种基于Java的实现了WebMVC设计模式的请

2024-03-25 18:22:44
php tp3.0框架里面的U方法怎么用
php tp3.0框架里面的U方法怎么用

phptp3.0框架里面的U方法怎么用U函数TP手册里面说的很详细啊:U方法的定义规则如下(方括号内参数根据实际应用决定):U('[分组/模块/操作]?参数'[,'参数','伪静态后缀','是否跳转','显示域名'])如果不定义项目和模块的话就表示当前项目和模块名称,例子:U('User/add')//生成User模块的add操作的URL地址U('Blog/rea

2024-09-15 01:18:52
thinkphp3.2 框架怎么写清除缓存
thinkphp3.2 框架怎么写清除缓存

thinkphp3.2框架怎么写清除缓存hinkPHP需要清除的缓冲有四个:模版缓存(Cache),数据缓存目录(Temp),日志目录(Logs),数据目录(Data)。//清除缓存目录functionclearCache($type=0,$path=NULL){if(is_null($path)){switch($type){case0://模版缓存目录$path=

2024-12-06 11:12:43
django框架和php框架哪个好(2023年最新解答)
django框架和php框架哪个好(2023年最新解答)

计算机语言排名前十名?以下就是我为大家整理的2017年最值得学习的编程语言TOP10!第10名:ScalaScala是由MartinOdersky设计的一种通用程序编程语言。2004年1月20日,Scala开始支持函数式编程,并推出强静态类型系统。为了达到简洁的目的,Scala的所有设计都来自于大家对于java的批评总结。Scala的源代码会被编译成Java字节代码,因此生成的

2024-12-17 10:48:48
在php框架中,是用框架提供的方法函数还是用原生php代码写,哪个效率高?同样逻辑下
在php框架中,是用框架提供的方法函数还是用原生php代码写,哪个效率高?同样逻辑下

在php框架中,是用框架提供的方法函数还是用原生php代码写,哪个效率高?同样逻辑下hp框架本身就是由原生的php代码写成的,原理上是和原生php没什么区别的。只是php框架在程序结构上和文件目录上对php代码做了很好的规范,使php程序更有调理、结构更加清晰,而且php框架本身就写好了很多常用的类和方法,可以大大的节约开发者时间。所以,理论上说php框架相对原生php的性能或效率是

2024-10-21 07:42:02
PHP处理数组常用的几个函数(php知识框架总结)
PHP处理数组常用的几个函数(php知识框架总结)

PHP处理数组常用的几个函数一、数组操作的基本函数数组的键名和值array_values($arr);获得数组的值array_keys($arr);获得数组的键名array_flip($arr);数组中的值与键名互换(如果有重复前面的会被后面的覆盖)in_array("apple",$arr);在数组中检索applearray_search("apple",$arr)

2024-11-10 12:12:07
python web框架有哪些
python web框架有哪些

pythonweb框架有哪些1、DjangoPython中最全能的Web开发框架,各种功能完备,可维护性和开发速度都一级棒,不少人反应Django框架慢,它主要慢在DjangoORM与数据库的交互上,所以是否使用Django框架,需要取决于项目对数据库交互的要求以及各种优化,而对于Django的同步特性导致吞吐量小的问题,可以通过Celery等解决,这并不是一个致命问题。2、Torn

2024-02-09 20:24:23
php中的回调函数怎么理解
php中的回调函数怎么理解

PHP将回调函数作用到给定数组单元的方法数组是PHP程序设计中十分重要的一环。本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上。具体如下:arrayarray_map(callable$callback,array$arr1[,array$...])array_map()返回一个数组,该数组包

2024-08-05 16:03:01