您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

php自定义函数的回调函数用法详解

2025/12/29 3:24:19发布15次查看
最近在开发一个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的回调函数的实现方法。
1. 全局函数的回调
这里的全局函数的意思,是直接使用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个参数是一个数组,表示参数列表,按照顺序依次会传递给要调用的函数。
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个元素是类名,第二个元素是要调用的函数名
3. 对象的方法的回调
先用最原始的字符串形式的调用方法尝试了一下,如下所示:
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();
然后,我用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自定义函数的回调函数用法详解的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product