zoukankan      html  css  js  c++  java
  • 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 = '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函数,这个方法可以用字符串来创建一个匿名函数,好,有思路了,可以创建一个匿名的函数,在这个匿名函数中,调用我们的回调函数,并把参数传进去。

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


    水平凡's Blog » PHP回调函数的实现方法
  • 相关阅读:
    PAT (Advanced Level) Practice 1071 Speech Patterns (25分)
    PAT (Advanced Level) Practice 1070 Mooncake (25分)
    PAT (Advanced Level) Practice 1069 The Black Hole of Numbers (20分)
    PAT (Advanced Level) Practice 1074 Reversing Linked List (25分)
    PAT (Advanced Level) Practice 1073 Scientific Notation (20分)
    第一次冲刺个人总结01
    构建之法阅读笔记01
    人月神话阅读笔记01
    四则运算2
    学习进度条(软件工程概论1-8周)
  • 原文地址:https://www.cnblogs.com/zhuanli/p/4112227.html
Copyright © 2011-2022 走看看