PHP可回调类型
一些函数如usort和call_user_func()可以作为用户自对应函数做为回调参数,回调函数不止是简单的函数,还可以是对象的方法(类方法),包括静态方法。
用户自定义函数作为回调函数的参数,PHP将函数以string形式传递的。可以使用任何内置或者用户自定义函数,除了PHP的语言结构如:array(), echo, empty(), eval(), exit(), isset(), list(), print或者unset()。
1,用usort()函数传递用户自定义函数对美国日期进行排序:
1 <?php
2 /*
3 用usort()函数对美国日期进行排序;
4 */
5
6 #定义日期,美国格式,是月日年,一般的格式是日月年或者年月日;现在要将它排序为以年月日的格式从大到小或者从小到大排序
7 $dates = array('10-10-2011', '2-17-2010', '2-16-2011', '1-01-2013', '10-10-2012');
8
9 #使用sort()函数对日期进行从小到大排序
10 echo "<p>Sorting the \$dates using the function sort().</p>";
11 sort($dates);
12 print_r($dates); #打印输出:Array ( [0] => 1-01-2013 [1] => 10-10-2011 [2] => 10-10-2012 [3] => 2-16-2011 [4] => 2-17-2010 )
13
14 #使用natsort()函数对人类认为的自然排序;
15 echo "<p>Sorting the \$dates using the function natsort().</p>";
16 natsort($dates);
17 print_r($dates); #打印输出:Array ( [0] => 1-01-2013 [3] => 2-16-2011 [4] => 2-17-2010 [1] => 10-10-2011 [2] => 10-10-2012 )
18
19 #前两种都不符合预期,试用usort()函数对$dates进行排序;
20 function sortDate($a,$b){
21 if ($a == $b){
22 return 0;
23 }else{
24 #将日期进行分割,对应的月日年分别赋值给对应的month,day,year。
25 list($amonth, $aday, $ayear) = explode("-", $a);
26 list($bmonth, $bday, $byear) = explode("-", $b);
27
28 #调用str_pad()函数对月份字符串进行填充。如果月份有两位则不填充,如果不够两位就在其左侧填充0;
29 $amonth = str_pad($amonth, 2, "0", STR_PAD_LEFT);
30 $bmonth = str_pad($bmonth, 2, "0", STR_PAD_LEFT);
31
32 #调用str_pad()函数对日期的字符串进行填充。如果日期有两位数则不填充,如果不够两位就在其左侧填充0;
33 $aday = str_pad($aday, 2, "0", STR_PAD_LEFT);
34 $bday = str_pad($bday, 2, "0", STR_PAD_LEFT);
35
36 #由于年份是四位,就不需要进行填充了,练手的话可以写一下
37 #ayear = str_pad($ayear, 4, "0", STR_PAD_LEFT);
38 #byear = str_pad($byear, 4, "0", STR_PAD_LEFT);
39
40 #对日期进行重组,按年月日的人类习惯进行重组
41 $a = $ayear . $amonth . $aday;
42 $b = $byear . $bmonth . $bday;
43
44 #返回值进行比较
45 return ($a > $b) ? 1: -1; //升序排序
46 #return ($a < $b) ? 1 : -1; //降序排列
47 }
48 }
49
50 echo "<p>Sorting the \$dates using the function usort().</p>";
51 usort($dates, "sortDate"); #函数回调,usort()函数回调自定义函数sortDate(),以字符串的形式作为参数传递到usort()。
52 print_r($dates); #打印输出:Array ( [0] => 2-17-2010 [1] => 2-16-2011 [2] => 10-10-2011 [3] => 10-10-2012 [4] => 1-01-2013 )
53 ?>
2,call_user_func()调用自定义函数:
1 <?php
2 #定义函数
3 function myCallBackFunction(){
4 echo "Hello, I am a PHPer!";
5 }
6 //将自定义函数myCallBackFunction以字符串的形式作为值传递给回调函数call_user_func();
7 call_user_func('myCallBackFunction'); #输出Hello, I am a PHPer!
8 ?>
回到函数类与对象的应用:
一个已被实例化的object的方法被作为array传递,下表0包含该object,下表1包含方法名。在同一个类里可以访问protected和private方法。
1,简单调用:
1 <?php
2 class myClass{
3 static function myCallBackMethod(){
4 echo "Hello, I am PHPer.\n";
5 }
6 public function anotherCallBackMethod(){
7 echo "Trump is a bad guy. His brain owned shit.";
8 }
9 protected function protectedMethod(){
10 echo "Secret garden 1.";
11 }
12 private function privateMethod(){
13 echo "Secret garden 2.";
14 }
15 }
16
17 $newclass = new myClass(); #实例化类得到一个$newclass对象
18 //调用静态方法
19 #对象myClass作为数组下标0以及类方法myCallBackMethod作为数组下标1,并且整体作为实参传递给回调函数call_user_func()
20 call_user_func(array('myClass', 'myCallBackMethod')); #输出:Hello, I am PHPer.
21
22 #实例化的对象$newclass作为数组下标0以及类方法myCallBackMethod作为数组下标1,并且整体作为实参传递给回调函数call_user_func()
23 call_user_func(array($newclass, 'myCallBackMethod')); #输出:Hello, I am PHPer.
24
25 #也可以这样调用
26 call_user_func("myClass::myCallBackMethod"); #::是调用静态方法的
27
28 #调用常规方法
29 call_user_func(array('myClass', 'anotherCallBackMethod')); #会报错,但是输出:Trump is a bad guy. His brain owned shit.
30 call_user_func(array($newclass, 'anotherCallBackMethod')); #输出:Trump is a bad guy. His brain owned shit.
31 call_user_func('myClass::anotherCallBackMethod'); #::是调用静态方法的,不过这样子调用好像只会出现一个:Strict standards的错误。输出:Trump is a bad guy. His brain owned shit.
32
33 #调用私有方法和受保护的方法报错;
34 call_user_func(array($newclass, 'protectedMethod')); #不能访问,cannot access protected method
35 call_user_func(array($newclass, 'privateMethod')); #不能访问:cannot access private method
36 ?>
2,父子调用:
1 <?php
2 /*
3 call_user_func()的父子调用
4 */
5 //定义父类A
6 class A {
7 public static function whoa(){
8 echo "I am A\n";
9 }
10 public function anotherMethodForCall(){
11 echo "Trump is a bad guy, his brain owned wholly shit.";
12 }
13 protected function MethodProtected(){
14 echo "Secret Garden.";
15 }
16 private function MethodPrivate(){
17 echo "Another secret Garden.";
18 }
19 }
20
21 #定义类B并且继承父类A
22 class B extends A {
23 public static function whob(){
24 echo "I am B\n";
25 }
26 }
27 $newa = new A();
28 $newb = new B(); #实例化子类B,得到对象$newb
29
30 //调用静态方法
31 call_user_func(array('B', 'whob')); #输出I am B;
32 call_user_func(array($newb, 'whob')); #输出I am B;
33 call_user_func(array('B','parent::whoa')); #调用类B的父类方法whoa,输出I am A;
34
35 //调用常规方法
36 call_user_func(array('A', 'anotherMethodForCall')); #报错但是依旧输出:Trump is a bad guy, his brain owned wholly shit.
37 call_user_func(array($newa, 'anotherMethodForCall')); #不报错输出:Trump is a bad guy, his brain owned wholly shit.Hello, PHP
38 call_user_func(array('B', 'anotherMethodForCall')); #报错输出:Trump is a bad guy, his brain owned wholly shit.
39 call_user_func(array($newb, 'anotherMethodForCall')); #不报错输出Trump is a bad guy, his brain owned wholly shit
40
41 call_user_func(array('B', 'parent::anotherMethodForCall')); #报错输出:Trump is a bad guy, his brain owned wholly shit.
42 call_user_func(array($newb, 'parent::anotherMethodForCall')); #不报错输出:Trump is a bad guy, his brain owned wholly shit.
43
44 call_user_func(array($newb, 'parent::MethodProtected')); #报错 cannot access protected method
45 call_user_func(array($newb, 'parent::MethodPrivate')); #报错cannot access private method A
46 #先记下,以后再说
47 class C {
48 public function __invoke($name){
49 echo "Hello, " .$name. "\n";
50 }
51 }
52 $classc = new C();
53 call_user_func($classc, 'PHP'); #输出:Hello, PHP
54 ?>
array_map()回调函数:
1 <?php
2 /*
3 php使用closure的实例
4 */
5 #定义函数并赋值给$double
6 $double = function($a){
7 return $a * 2;
8 }; #如果像这样写,那么大括号的冒号是必须的;
9
10 $numbers = range(1,5); #数字数组1,5赋值给$numbers;
11
12 #调用array_map()函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,回调函数接收的参数数目应该和传递给array_map()函数的数组数目一致;
13 $new_numbers = array_map($double, $numbers);
14
15 #调用implode()函数将数组元素进行分割,返回由数组元素组合成的字符串;并依次输出.
16 print implode('-', $new_numbers); #输出:2-4-6-8-10
17
18 //-----------------是不是也可以这样写-----------//
19 #定义函数myFunction
20 function myFunction($a){
21 return $a * 2;
22 } #大括号后面可以不需要冒号;
23
24 $numbers = range(1,5);
25 $new_numbers = array_map('myFunction', $numbers);
26
27 print implode("+",$new_numbers); #输出2+4+6+8+10
28 ?>
PHP可回调类型的更多相关文章
- php--->使用callable强制指定回调类型
php 使用callable强制指定回调类型 如果一个方法需要接受一个回调方法作为参数,我们可以这样写 <?php function dosth($callback){ call_user_fu ...
- PHP Callable强制指定回调类型的方法
如果一个方法需要接受一个回调方法作为参数,我们可以这样写 <?php function dosth($callback){ call_user_func($callback); } functi ...
- php之强制回调类型callable
<?php function demo(callable $fn) { $fn(); } function callback() { echo __FUNCTION__,'<br/> ...
- [WCF编程]10.操作:回调操作
一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...
- WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).
WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...
- php的类型约束
//如下面的类 class MyClass { /** * 测试函数 * 第一个参数必须为 OtherClass 类的一个对象 */ public function test(OtherClass $ ...
- 类型 - PHP手册笔记
类型简介 PHP 支持 8 种原始数据类型. 四种标量类型: boolean(布尔型,不区分大小写) integer(整型) float(浮点型,也称作double) string(字符串) 两种复合 ...
- PHP 不同类型之间的松散和严格比较
原始数据类型 在比较之前先简单介绍一下PHP的9种原始数据类型,包括 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string(字符串 ...
- php值callback类型和匿名函数(闭包)
callback.callable类型 自PHP5.4起可以使用callable类型制定回调类型callback. 本文档基于同样理由使用callback类型信息. 一些函数如call_user_fu ...
随机推荐
- nginx学习首页随机模块
在default.conf下加入这行开启随机模块,在root目录下放入几种不同的html 改完保存下,使用命令检查nginx语法是否正确 nginx -tc /etc/nginx/nginx.conf ...
- [转载]Windows环境下 Hadoop Error: JAVA_HOME is incorrectly set. 问题
最近尝试在windows开发MR程序并且提交Job,在解压缩好hadoop,配置好环境变量后, 打开cmd 输入hadoop version 的时候出现以下错误: Error: JAVA_HOME i ...
- 区块链V1版本实现之三
部分程序代码(区块链的定义及遍历打印): 1 //创建区块链,使用Block数组模拟 2 type BlockChain struct { 3 Blocks []*Block 4 } 5 6 //实现 ...
- python办公入门7:xlwt
xlwt写入excel步骤 创建工作簿 创建工作表 填充工作表内容 保存文件 1 import xlwt 2 3 #创建工作簿 4 wb=xlwt.Workbook() 5 #创建工作表 6 ws=w ...
- gitlab 文件读取+rce复现 CVE202010977
文件读取实现,首先生成两个project 再任意一个project添加issue,然后描述如下: ![a](/uploads/11111111111111111111111111111111/../. ...
- 小白也能看懂的mySQL进阶【单表查询】
目录 1.查询基础 SELECT语句基础 列的查询 为列设定别名 常数的查询 过滤表中重复数据 根据WHERE语句来选择记录 注释的书写方法 算术运算符和比较运算符 算术运算符 需要注意NULL 比较 ...
- Python正则表达式re模块和os模块实现文件搜索模式匹配
☞ ░ 前往老猿Python博文目录 ░ 因测试需要,需要提供一个可以指定目录搜索符合条件的文件名函数,搜索时可以通过*(星号)匹配0-n个字符,?(问号)匹配任意1个字符,可以指定多个文件类型,每个 ...
- moviepy音视频剪辑:AudioClip帧处理时报TypeError: only size-1 arrays can be converted to Python scalar错
☞ ░ 前往老猿Python博文目录 ░ 一.环境 操作系统:win7 64位 moviepy:1.0.3 numpy:1.19.0 Python:3.7.2 二.应用代码及报错信息 程序代码 if ...
- 第二十七章、containers容器类部件QTabWidget选项窗部件详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- 第11.12节 Python元字符“|”支持的正则表达式多选一匹配模式
re模块支持多个正则表达式使用"|"(逻辑或)模式来组合,扫描目标字符串时, '|' 分隔开的正则表达式组合从左到右进行匹配,只要其中一个匹配成功就认为该组合匹配成功,不再进行组合 ...