PHP回调函数

回调函数

我们调用php系统提供的函数叫直接调用,也叫: 直调,而php系统调用用户自定义的函数,必须要通过一个代理函数来调用,叫间接调用,也叫回调。在PHP中有两种常见的回调函数:call_user_func()和call_user_func_array(),它们可以代替系统来调用我们自己定义的函数:

call_user_func_array($callback, $array):使用数组参数执行回调函数
call_user_func($callback, $array):第一个参数作为回调函数调用
说明:1.回调中通常不需要写参数,而是通过其它函数来获取;   2.参数不允许使用引用传递

call_user_func

1、单个参数:

<?php
  
echo call_user_func(function(){

    //如果匿名回调没写参数,可以通过func_get_args()获取

    return '欢迎来到'.func_get_arg(0);

},'Baidu');

echo '<hr>';

echo call_user_func(function($site){

    return '欢迎来到'.$site;

},'Baidu');

echo '<hr>';

?>

2、多个参数:

<?php
echo call_user_func(function($site,$course){

    return '欢迎来到'.$site.'学习'.$course.'课程';

},'w3school','php');

echo '<hr>';

//支持调用类中的方法做为回调

class Demo1
{
    //普通方法
    public function sum($a, $b)
    {
        return $a+$b;
    }
}
class Demo2

{
    //静态方法
    public static function multi($a,$b)

    {
        return $a*$b;
    }

}

?>

调用普通方法:回调必须以数组方式传入: [对象,'方法名']

$obj = new Demo1;  
echo call_user_func([$obj,'sum'],10,15);

php5.4+以上,可以简写:

echo call_user_func([(new Demo1()),'sum'],10,15);  
echo '<hr>';

调用静态方法:有字符串和数组二种方式

A、字符串: '类名::方法名'

echo call_user_func('Demo2::multi',10,15);

B、数组: [类名,'方法名']

echo call_user_func(['Demo2','multi'],20,5);

如果有命名空间,只要在类名前加上命名空间字符串就可以了,或者用常量__NAMESPACE__

理解了call_user_func()那么call_user_func_array()就非常简单了,仅仅是参数不同

call_user_func_array(callback, array)

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

<?php

echo '<hr>';

echo call_user_func_array(function(){

    //查看传递给回调的参数

  //return print_r(func_get_args(),true);

    $msg = '前端开发的基础知识包括:';

    //遍历参数数组

    foreach (func_get_args() as $value) {

        $msg .= $value.',';
    }

    //去掉未尾逗号,并替换成感叹号
    return rtrim($msg,',').'!';

}, ['html','css','javascript']);

echo '<hr>';

class Demo3

{
    public function func1()

    {
        return __METHOD__.'<pre>'.print_r(func_get_args(),true).'</pre>';
    }
}

class Demo4 

{
    public static function func2()

    {
        return __METHOD__.'<pre>'.print_r(func_get_args(),true).'</pre>';
    }
}

?>

回调类中的方法

echo call_user_func_array([(new Demo3),'func1'], ['php','java','c']);

调用静态方法的回调:

1.使用数组参数方式

echo call_user_func_array(['Demo4','func2'], ['html','css','jQuery']);

2.使用字符串参数方式

echo call_user_func_array('Demo4::func2', ['html','css','jQuery']);

如果有命名空间,只需要在类名前加上命名空间或__NAMESPACE__即可

参考:https://www.php.cn/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值