当前位置: 首页 > news >正文

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/

相关文章:

  • MySQL中的Information_schema
  • 【DoraBox实战】————1、SQL注入分析与研究
  • XSS测试平台使用
  • 【DoraBox实战】————2、XSS分析与研究
  • 【DoraBox实战】————3、CSRF分析与研究
  • 【DoraBox实战】————4、文件包含分析与研究
  • 【木马终端】————1、中国蚁剑的使用与功能介绍
  • 【DoraBox实战】————5、文件上传分析与研究
  • 【DoraBox实战】————6、代码执行分析与研究
  • 【DoraBox实战】————7、命令执行分析与研究
  • 【DoraBox实战】————8、SSRF分析与研究
  • CEYE平台使用简介
  • 【DoraBox实战】————9、任意文件读取
  • 【DoraBox实战】————10、XXE分析与研究
  • 如何关闭电脑开机自启
  • #Java异常处理
  • [译]Python中的类属性与实例属性的区别
  • 【笔记】你不知道的JS读书笔记——Promise
  • android 一些 utils
  • Centos6.8 使用rpm安装mysql5.7
  • es6--symbol
  • Laravel Telescope:优雅的应用调试工具
  • MQ框架的比较
  • React+TypeScript入门
  • 从零开始在ubuntu上搭建node开发环境
  • 给新手的新浪微博 SDK 集成教程【一】
  • 记一次删除Git记录中的大文件的过程
  • puppet连载22:define用法
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #{} 和 ${}区别
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)pulsar安装在独立的docker中,python测试
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .NET 分布式技术比较
  • .NET运行机制
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @我的前任是个极品 微博分析
  • [.net] 如何在mail的加入正文显示图片
  • []error LNK2001: unresolved external symbol _m
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20160902]rm -rf的惨案.txt
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AIGC 大数据基础]hive浅谈
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++]类和对象(中)
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [codeforces]Recover the String
  • [HTML API]HTMLCollection
  • [iOS]把16进制(#871f78)颜色转换UIColor
  • [iOS]随机生成UUID通用唯一识别码
  • [Java开发之路](14)反射机制