• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php 回调函数的实现方法?

php 搞代码 4年前 (2022-01-22) 22次浏览 已收录 0个评论

全局回调函数:

这里的全局函数的意思,是直接使用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 = '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 = ar<div style="color:transparent">本文来源gaodai.ma#com搞##代!^码@网*</div><pre>搞gaodaima代码

ray( 'hello' , 'world' );$myobj->$fnName();

成功了,输出结果

调用是成功了,不过如何把参数params传给这个方法呢,如果把params直接传进去,那么它会作为1个参数,怎么把params拆开来传进去呢?
查了下PHP手册,找到了create_function函数,这个方法可以用字符串来创建一个匿名函数,好,有思路了,可以创建一个匿名的函数,在这个匿名函数中,调用我们的回调函数,并把参数传进去。

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' );$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();

以上就是php 回调函数的实现方法?的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php 回调函数的实现方法?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址