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
?>

③详情参考这个博客

我要青春像陈孝正一样,不能有一毫米的误差! 我要青春像合伙人一样,为了自尊而战!
原文地址:https://www.cnblogs.com/fanglove/p/3117963.html