【web 开发基础】PHP类静态函数和对象方法的回调 (37)

举报
迷彩 发表于 2023/06/30 19:25:13 2023/06/30
【摘要】 前言前面两篇文章《【web 开发基础】PHP 回调函数之变量函数 (35)》和《【web 开发基础】PHP 自定义回调函数之 call_user_func_array() (36)》中介绍的都是通过全局函数的方式声明和应用的回调函数,即是没有在任何对象或类中定义的函数中使用回调函数,但是,如果遇到回调类中的静态方法,或者是对象中的普通方法,则会有所不同。回调的方法,如果是一个类的静态方法或对...

前言

前面两篇文章《【web 开发基础】PHP 回调函数之变量函数 (35)》和《【web 开发基础】PHP 自定义回调函数之 call_user_func_array() (36)》中介绍的都是通过全局函数的方式声明和应用的回调函数,即是没有在任何对象或类中定义的函数中使用回调函数,但是,如果遇到回调类中的静态方法,或者是对象中的普通方法,则会有所不同。回调的方法,如果是一个类的静态方法或对象中的一个成员方法,那又应该怎么办呢?在我们文章《【web 开发基础】PHP 自定义回调函数之 call_user_func_array() (36)》中我们介绍了php的回调函数的call_user_func_array() 函数。我们了解到在call_user_func_array() 函数的应用中。可以将第一个参数函数名称 “字符串”改成“ 数组类型的参数”。下面我们通过一个实例来介绍类静态函数和对象的方法回调相关的做法。

编程实践


分别声明一个类,一个类中声明一个静态方法,另一个类中声明一个普通方法,通过调用不同的方法对比两种方法的回调有和区别。下面同样使用系统函数call_user_func_array()调用类中的静态成员方法和实例对象成员方法。

<?php

//声明一个类demo,类中声明一个静态成员方法fun()

 class DemoClass{
   static function fun($m1,$m2){
     echo "m1 = ".$m1;
     echo "\n";
     echo "m2 = ".$m2;
   }
 }

//声明一个类test,类中声明一个静态成员方法fun()

 class TestClass{
   function fun($m1,$m2){
     echo "m1 = ".$m1;
     echo "\n";
     echo "m2 = ".$m2;
   }
 }

//通过使用系统函数call_user_func_array(),调用demo类中的静态成员方法fun()
call_user_func_array( array("DemoClass","fun"), array("hello", "world"));
echo "\n------------完美的分割线------------\n";

//通过使用系统函数call_user_func_array(),调用test类中的实例对象成员方法fun()
call_user_func_array( array(new TestClass(),"fun"), array("你好","欢迎你"))

?>

执行结果如下图所示:

所有使用 call_user_func_array() 函数来实现的自定义回调函数,或者php系统中为我们提供的所有回调函数,都可以像此函数一样,在第一个参数中使用数组类型值,而且数组中必须使用两个元素:从上面的代码可以看出如果调用类中的成员方法,就需要在这个数组参数中指定第一个元素为类名称字符串;第二个元素则是这个类中的静态方法名称的字符串;如果调用对象中的成员方法名称,则这个数组中的第一个元素是对象的引用,第二个元素则是该对象中的成员方法名称的字符串。 call_user_func_array() 函数的第二个参数使用是没有变化的。

总结

回调函数的语法格式如下,其中 callback() 代表所有回调函数:

1、回调全局函数

callback("函数名称字符串")

2、回调类中的静态成员方法

callback(array("类名称字符串","类中静态方法名称字符串"))

3、回调对象中的成员方法

callback(array(对象引用,"对象中方法名称字符串"))

系统为我们提供的回调函数和我们自定义的回调函数在调用方法上都是完全相同的。在PHP中提供的带有回调函数的系统函数有很多,用法上差别应该不大,如果在后续的文章中涉及到我们再详细介绍。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。