array_map()关于回调函数的总结
array_map()函数的第一个参数可以是匿名函数,系统函数,也可以是自己自定义的函!在全局空间下,这些函数的调用都很简单 在这里就不多说了!我们主要讨论的是该函数调用类中的方法和静态方法的区别
摘录一段php手册的例子简要的说明一下:
<?php
function cube($n){
return $n * $n * $n;
} $a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
?>
那么,如果你在一个php类中通过array_map()函数回调内部的方法又该如何做呢
同样的 我们在php手册中找到一段用户添加的说明:
If you need to call a static method from array_map, this will NOT work:
(如果你想在array_map函数中回调一个静态方法,那么下面的做法是错误的)
<?php
$a = array(1, 2, 3, 4, 5);
$b = array_map("myclass::myMethoed", $a);
print_r($b);
?>
Instead, you need to do this:
(你应该做如下调用)
<?php
$a = array(1, 2, 3, 4, 5);
$b = array_map(array("myclass","myMethoed"), $a);
print_r($b);
?>
例如
class abc{
public function abc1(){
//code....
}
public function abc2(){
$a=array(1,2,3,4,5);
array_map(array($this,'abc1'),$a);
}
}
上文中的$this可以用__CLASS__类的魔术常量代替 我们强烈推荐使用此常量 因为不论你的类如何的修改 都能最终保证结果是正确的
如果是在类的外部调用类的方法呢??
这里分为两种情况:
1.如果在类的外部调用的是类的静态方法:
可以这样的用:
<?php
class cube{ public static function cube1($n){ return $n*$n; } }
$a=array(1,2,3,4,5);
var_dump(array_map(array('cube','cube1'),$a)); 输出的结果为:array(5) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) [4]=> int(25) }
我们把static 关键字去掉 会出现什么样的结果呢??
class cube{
public function cube1($n){
return $n*$n;
}
}
$a=array(1,2,3,4,5);
var_dump(array_map(array('cube','cube1'),$a));
会被曝这样的错误:Deprecated: array_map() expects parameter 1 to be a valid callback, non-static method cube::cube1() should not be called statically in E:\fsh\ceshi2.php on line 12
array(5) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) [4]=> int(25) }
由此可知:在类的外面array_map()只能调用静态的方法,那么能不能调用非静态的方法呢 答案是肯定的
<?php
class cube{ public function cube1($n){ return $n*$n; } }
$a=array(1,2,3,4,5);
var_dump(array_map(array(new cube,'cube1'),$a));
返回的结果:array(5) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) [4]=> int(25) }
tip:以上内容是自己的理解,欢迎大家留言补充!!!
array_map()关于回调函数的总结的更多相关文章
- php回调函数的使用
1.array_map — 将回调函数作用到给定数组的单元上 参数:array array_map ( callable $callback , array $arr1 [, array $... ] ...
- array_map 等php回调函数使用问题(关联数组下标获取)
前言:我自己用此类回调函数,来替代 foreach 纯粹是用为代码的简洁性,让代码更好看.(我有点代码小洁癖~) 1.array_reduce 当迭代处理一个一维索引数组时,在回调函数内是无法获取到当 ...
- PHP中的回调函数和匿名函数
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- array_reduce方法用回调函数迭代地将对数组的值进行操作
在处理php数组的时候,有一种需求特别的频繁,如下二维数组: $arr = array( 1=>array( 'id' => 5, 'name' => '张三' ), 2=>a ...
- is_callable Callbacks / Callables What is a “callable”? 可调用 回调函数
PHP: Callback / Callable 类型 - Manual https://www.php.net/manual/zh/language.types.callable.php Callb ...
- 小兔JS教程(三)-- 彻底攻略JS回调函数
这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...
- 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比
C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
随机推荐
- LVS+OSPF 架构(转)
http://blog.51cto.com/pmghong/1399385 LVS 和 LVS+keepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVS+OSPF.这个架构实际上 ...
- phaser小游戏框架学习中的屏幕适配
这篇博客主要讲一下上一篇博客的右侧和底部出现的问题.就是页面会有偏移量.说一下这个产生的原因吧. 一开始在构建html页面的时候,习惯性的在页面中加了 <meta name="view ...
- 「FJ2014集训」采药人的路径
啦啦啦 来写一篇题解 洛谷链接: P4930 「FJ2014集训」采药人的路径 统计路径?嗯往点分治上想. 把0和1转化为-1和1,求和完dis为0的路径就是阴阳平衡的路径了. 如果题目没有限制要有中 ...
- BA 认证
IIBA-CBAP https://www.iiba.org/standards-and-resources/core-standard/ PMI-PBA https://www.pmi.org/ce ...
- ExtJS 4.2.1学习笔记(二)——主题theme
1 UI组件基础 学习ExtJs就是学习组件的使用.ExtJs4对框架进行了重构,其中最重要的就是形成了一个结构及层次分明的组件体系,由这些组件形成了Ext的控件. E ...
- HTML用JS导出Excel的五种方法
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Canvas 动态小球重叠效果
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Codeforces Round #305 (Div. 2) A
Description While Mike was walking in the subway, all the stuff in his back-bag dropped on the groun ...
- Linux磁盘分区管理
1.分区步骤 fdisk -l 查看系统中的磁盘 fdisk /dev/vdb ...
- java——线程的wait()和notify()
这是一个关于生产者和消费者的线程通信的例子: package thread_test; public class PCThread { public static void main(String[] ...