首页 > 编程语言 >【web 开发基础】PHP自定义回调函数之call_user_func_array()

【web 开发基础】PHP自定义回调函数之call_user_func_array()

时间:2023-05-01 10:32:11浏览次数:40  
标签:web 函数 自定义 call user func 参数 array PHP

前言

从上一篇文章中我们了解到,回调函数是将一个函数作为参数传递到调用的函数中。如果在函数的格式说明中出现 callback 类型的参数,则该函数就是回调函数。虽然可以使用变量函数去声明自己的回调函数,不过我们通常大多还是会通过借助 call_user_func_array() 函数去实现。通过借助call_user_func_array()来实现函数的回调,使得回调的方式更加灵活,使用更加方便。call_user_func_array()函数时PHP的一个内置函数,call_user_func_array()本身就是一个回调函数,使用call_user_func_array()来实现函数的回调的语法格式如下:

mixed call_user_func_array(callback function, array param_array);

从上面的语法格式可以看出,call_user_func_array()函数有两个参数,第一个参数因为使用伪类型 callback, 所以这个参数需要传递的是一个字符串,表示要调用的函数名;第二个参数则是一个数组类型的参数,表示参数列表,按照顺序依次会对应地传递给要调用的函数。

编程实践

下面我们通过实例来体验一下call_user_func_array()函数的用法:声明一个fun()函数通过回调的方式去调用该函数

<?php
 function fun($msg1, $msg2){

   echo "$msg1 = ".$msg1;

   echo "\n";

   echo "$msg2 = ".$msg2;

 }

 //通过系统函数call_user_func_array()调用函数fun(),第一个参数为函数的fun的名称字符串

 call_user_func_array("fun",array("hello","world"));

?>

执行结果如下图所示:

【web 开发基础】PHP自定义回调函数之call_user_func_array() _自定义

上面的例子中第14行代码,通过系统函数 call_user_func_array() 调用自己定义的函数 fun(),将函数 fun() 的名称字符串传递给了 call_user_func_array() 函数中的第一个参数,第二个参数则需要的是一个数组,数组中的元素个数必须和 fun()函数的参数列表的个数相同。因为这个数组参数中的每个元素的值都会通过 call_user_func_array() 函数 ,按照顺序依次传递给回调到的函数 fun()参数列表对应的参数中。所以我们可以将前面通过变量函数实现的自定义回调函数,改成借助 call_user_func_array() 函数的方式进行实现。

改进代码如下:

<?php

 //声明回调函数filter, 在0-30的整数中通过自定义条件过滤不要的数字

 function filter($fun){
   for($i=0; $i<=30; $i++){
     //使用系统函数call_user_func_array(),调用和变量$fun值相同的函数
     if(call_user_func_array($fun,array($i)))
	 {
		continue;
	 }
     echo $i . "\n";
   }
 }

 //声明一个函数one,如果参数是3的倍数就返回ture,否则返回false

 function one($num){
   return $num%3 == 0;
 }

 //声明一个函数two,如果参数是一个回文数返回ture,否则返回false

 function two($num){
   return $num == strrev($num);
 }
 filter("one");   //打印出30以内非3的倍数,参数one是函数one()的名称字符串,是一个回调

 echo "----------完美的分割线-----------\n";

 filter("two");   //打印出30以内非回文数,参数two是函数two()的名称字符串,是一个回调

?>

执行结果如下:

【web 开发基础】PHP自定义回调函数之call_user_func_array() _回调函数_02

从执行结果可以看出,自定义的函数 filter()内部,将原来的变量函数位置修改写成借助 call_user_func_array() 函数的调用方式进行回调自定义函数,而函数 filter()的应用方式没有任何发生变化

标签:web,函数,自定义,call,user,func,参数,array,PHP
From: https://blog.51cto.com/micai01/6238622

相关文章

  • 云原生之使用Docker部署webssh工具sshwifty
    (云原生之使用Docker部署webssh工具sshwifty)一、sshwifty介绍1.sshwifty简介sshwifty是一款WebSSH&Telnet(WebSSH&WebTelnet客户端工具。2.shwifty特点shwifty是为Web设计的SSH和Telnet连接器。它可以部署在您的计算机或服务器上,为任何兼容(标准)的网络浏览器......
  • web2
    序前面介绍过网页html的一些技术实现和大体架构,但对于后端boy,还是不太想计较那么多html方面的事,所以想把注意力集中回原先的python体系。针对简单的html的动态生成和一些个底层tcp/udp乃至上层http连接,都不用关注,只需要编写对应的接口响应函数,这种技术叫做WSGI,WebServerGatewa......
  • MySQL Workbench和phpMyAdmin
    MySQLWorkbench是MySQL官方提供的一款开源的图形化管理工具,可以用于设计、开发、管理和维护MySQL数据库。MySQLWorkbench提供了一个集成开发环境(IDE),其中包含多个工具和功能,包括:1.数据建模工具:可以用于设计数据库模型、创建和编辑表、定义列、设置约束等。2.SQL编辑器:可以用......
  • Dockers下php容器中安装redis扩展
    首先进入php容器dockerexec-it容器ID或名称查看php安装位置  whichphp查看php已安装扩展  php-m1、下载redis扩展包   redis扩展下载地址【https://pecl.php.net/package/redis 】下载相应版本的扩展2、解压扩展包   tar-zxvfredis-5.1.1.tg......
  • 一个android的webview的例子
    截图如图所示。核心部分代码packagecom.example.app;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importandroid.support.v7.app.ActionBarActivity;importandroid.support.v7.app.ActionBar;importandroid.support.v4.app.Fragment;......
  • 自定义快捷键
    问题:复制粘贴的快捷键是CtrlC和CtrlV,在现实中粘贴值到可见单元格的用处更大,如何将这一功能自定义成快捷键?解决:【文件】》【选项】》【自定义功能区】 输入命令“粘贴值”,点击【请按新快捷键】,依次按下指定的快捷键(假设为Ctrl+Shift+V),点击【指定】 据此法,可以自定义任意命......
  • websocket群聊实战
    演示及源码地址:演示地址:https://www.wchime.xyz/#/后端代码:https://gitee.com/mom925/wchime-web-api前端代码:https://gitee.com/mom925/uniapp-web项目说明项目技术:django+mysql+uwsgi+nginx+uniapp逻辑:以django搭建一个webso......
  • Spring WebFlux简介
    一、为什么需要webFlux部分原因是需要一个无阻塞的web堆栈来处理少量线程的并发性,并用更少的硬件资源进行扩展。Servlet3.1确实为非阻塞I/O提供了一个API。然而,使用它会偏离ServletAPI的其余部分,在那里交互是同步的(Filter,Servlet)或阻塞的(getParameter,getPart)。这就是一个新的......
  • 手写web框架--了解web运行机制。
    第一步--写一个服务端importsocketserver=socket.socket()#默认就是TCP协议server.bind(('127.0.0.1',8080))server.listen(5)whileTrue:conn,addr=server.accept()#三次四次挥手data=conn.recv(1024)#接收消息print(data)conn.se......
  • 《CTFshow-Web入门》07. Web 61~70
    目录web61~65题解web66知识点题解web67知识点题解web68知识点题解web69知识点题解web70知识点题解ctf-web入门web61~65题解这几个题都和web58一样。可能内部禁用的函数不一样吧。但payload都差不多。不多解释了。以下解法随便挑一个即可。可能不同题会有部分函数被......