• php之Callback 回调类型


    1.二话不说,先上官方例子

    <?php 
    
    // An example callback function
    function my_callback_function() {
        echo 'hello world!';
    }
    
    // An example callback method
    class MyClass {
        static function myCallbackMethod() {
            echo 'Hello World!'.'<br/>';
        }
        function myTwoCallback(){
            echo 'hello dazhu'.'<br/>';
        }
    }
    
    // Type 1: Simple callback
    call_user_func('my_callback_function'); 
    
    // Type 2: Static class method call
    call_user_func(array('MyClass', 'myCallbackMethod')); 
    call_user_func(array('MyClass', 'myTwoCallback'));//官方文档中没有提供非静态方法的这种使用,可是我这却能使用,疑问
    
    // Type 3: Object method call
    $obj = new MyClass();
    call_user_func(array($obj, 'myCallbackMethod'));
    call_user_func(array($obj, 'myTwoCallback'));
    
    // Type 4: Static class method call (As of PHP 5.2.3)
    call_user_func('MyClass::myCallbackMethod');
    
    // Type 5: Relative static class method call (As of PHP 5.3.0)
    class A {
        public static function who() {
            echo "A\n";
        }
    }
    
    class B extends A {
        public static function who() {
            echo "B\n";
        }
    }
    
    call_user_func(array('B', 'parent::who')); // A
    
    // Type 6: 
    function dazhu_callback_function($test) {
        echo $test;
    }
    call_user_func("dazhu_callback_function","dazhu come on"); // dazhu come on
    ?>

    输出结果:

    // Type 1结果
    hello world!
    // Type 2结果
    Hello World!
    hello dazhu
    // Type 3结果
    Hello World!
    hello dazhu
    // Type 4结果
    Hello World!
    // Type 5结果
    A

    call_user_func--->用法参考上述代码

     返回值Returns the return value of the callback, or FALSE on error.

     注意    :在函数中注册有多个回调内容时(如使用 call_user_func() 与 call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用

    2.二话不说,再上个高级的官方例子

    <?php
    // Our closure
    $double = function($a) {
        return $a * 2;
    };
    
    // This is our range of numbers
    $numbers = range(1, 5);
    
    // Use the closure as a callback here to 
    // double the size of each element in our 
    // range
    $new_numbers = array_map($double, $numbers);
    
    print implode(' ', $new_numbers);
    ?>
    
    //输出结果:2 4 6 8 10

    array_map--->将回调函数作用到给定数组的单元上

     返回值 :返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致

     参见:

    implode--->可以说是连接一个数组内的各个item。连接字符串用指定字符

     返回值:Returns a string containing a string representation of all the array elements in the same order, with the glue string between each element.

     举个简单例子:一目了然

    <?php
    
    $array = array('lastname', 'email', 'phone');
    $comma_separated = implode(",", $array);
    
    echo $comma_separated; 
    
    //结果是 :  lastname,email,phone
    ?>

      参见:

     

    3.最后进入主题:

    ①一些函数可以接受用户自定义的回调函数作为参数,回调函数不止是简单自定义函数,也可以是对象方法,或者对象的静态方法

    ②一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如: array(), echo, empty(), eval(), exit(), isset(), list(), print 或unset()

    ③一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名

    ④静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'

    ⑤除了普通的用户自定义函数外, create_function() 可以用来创建一个匿名回调函数。自 PHP 5.3.0 起也可传递 closure 给回调参数

    4.最后再加一个无关主题但是却很有用的知识点:

    ①.变量的引用

    PHP 的引用允许你用两个变量来指向同一个内容

    <?
        $a="ABC";
        $b =&$a;
        echo $a;//这里输出:ABC
        echo $b;//这里输出:ABC
        $b="EFG";
        echo $a;//这里$a的值变为EFG 所以输出EFG
        echo $b;//这里输出EFG
    ?>

    ②.函数的引用传递(传址调用

    传址调用我就不多说了 下面直接给出代码

    <?php
        function test(&$a)
        {
            $a=$a+100;
        }
        $b=1;
        echo $b;//输出1
        test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
        echo "<br>";
        echo $b;//输出101
    ?>

    ③详情参考这个博客

    我要青春像陈孝正一样,不能有一毫米的误差! 我要青春像合伙人一样,为了自尊而战!
  • 相关阅读:
    REST easy with kbmMW #16 – Multiple servers using HTTP.sys transport
    Delphi直接实现分享图片功能
    kbmMW随机数与强密码
    kbmMW基于硬件生成随机数
    用StringHelper.Split分解字符串
    安装和配置HyperServer
    深入了解HyperServer
    Delphi revelations #1 – kbmMW Smart client on NextGen (Android) – Scope problems
    ClientAsTemplate用法
    Java8 Optional总结
  • 原文地址:https://www.cnblogs.com/fanglove/p/3117963.html
Copyright © 2020-2023  润新知