16-2用户回调代理执行函数–PHP实战开发教程

16-2用户回调代理执行函数–PHP实战开发教程

剩奶婪镐靛锋可村拨青灸揭兑


二:两个执行回调的函数
什么是回调?
答:
我们调用php系统提供的函数叫直接调用,也叫: 直调
php系统调用用户自定义的函数,必须要通过一个代理函数来调用,叫间接调用,也叫回调
以下是两个系统定义的函数,用来执行回调
1.call_user_func(callable,args…)
2.call_user_func_array(callable,[…])


新建demo2.php

直调:

<?php

function test()
{
//    func_get_arg(0)获取传入的第一个参数
    echo "欢迎来到".func_get_arg(0);
}
//直调:按名调用
echo test('萌面人资料铺');

执行:

16-2用户回调代理执行函数–PHP实战开发教程第1张


改成回调,让系统来调用 系统要通过一个代理函数来完成

<?php

function test()
{
//    func_get_arg(0)获取传入的第一个参数
    echo "欢迎来到".func_get_arg(0);
}
//改成回调,让系统来调用 系统要通过一个代理函数来完成
//第一个参数为函数名,第二个参数为传递给函数的值
echo call_user_func('test','萌面人资料铺');

执行:

16-2用户回调代理执行函数–PHP实战开发教程第1张


直接使用匿名函数:

<?php

//改成回调,让系统来调用 系统要通过一个代理函数来完成
//第一个参数为函数名,第二个参数为传递给函数的值
echo call_user_func(function(){echo "欢迎来到".func_get_arg(0);},'萌面人资料铺');

执行:

16-2用户回调代理执行函数–PHP实战开发教程第1张


另一种写法:

<?php
//改成回调,让系统来调用 系统要通过一个代理函数来完成
//第一个参数为函数名,第二个参数为传递给函数的值
echo call_user_func(function($siteName){echo "欢迎来到".$siteName;},'www.xuexianswer.com');

执行:

16-2用户回调代理执行函数–PHP实战开发教程第1张


如果实参多余形参,多余的实参会被忽略

<?php
echo call_user_func(function($siteName,$course){echo "欢迎来到".$siteName."学习".$course;},'www.xuexianswer.com','php','java');

执行,第三个实参java被忽略

16-2用户回调代理执行函数–PHP实战开发教程第5张


调用类中的方法做为回调

<?php
//支持调用类中的方法做为回调
class Demo1
{
    //普通方法
    public function sum($a,$b)
    {
        return $a+$b;
    }
}
//调用普通方法
$obj=new Demo1();
//[$obj,'sum']执行obj对象中的sum方法
echo call_user_func([$obj,'sum'],10,15);

执行:

16-2用户回调代理执行函数–PHP实战开发教程第6张

如果PHP版本为php5.4+,new还可以简写:

<?php
//支持调用类中的方法做为回调
class Demo1
{
    //普通方法
    public function sum($a,$b)
    {
        return $a+$b;
    }
}
//[$obj,'sum']执行obj对象中的sum方法
echo call_user_func([(new Demo1()),'sum'],10,15);

执行:

16-2用户回调代理执行函数–PHP实战开发教程第6张


2.call_user_func_array(callback, array)
只接受二个参数:回调,索引数组,传给回调的参数全部打包到索引数组中
与call_user_func(array,arg1…)不同之处仅仅传递参数方式不同
回调同样支持:字符串函数名,类名,数组,匿名函数

<?php
echo call_user_func_array(function(){
    $msg="前端开发的基础知识包括";
    //func_get_args()获取函数中的所有参数
    foreach (func_get_args() as $value)
    {
        $msg.=$value." ";
    }
    return $msg;
},['html','css','javascript']);

执行:

16-2用户回调代理执行函数–PHP实战开发教程第8张


用代理函数调用静态方法:

<?php
class Demo1
{
    public static function multi($a,$b)
    {
        return $a*$b;
    }
}
//用代理函数调用静态方法有两种方式:
//1.数组参数:
echo call_user_func(['Demo1','multi'],5,6);
echo "<hr>";
//2.字符串方式
echo call_user_func('Demo1::multi',10,6);

执行:

16-2用户回调代理执行函数–PHP实战开发教程第9张


恫殊标构和邓匣蚊哎形劫跨溉