PHP中的ArrayAccess用法详解
在Laravel的源码当中,作者多次使用到了PHP SPL中的ArrayAccess接口,那么这个ArrayAccess接口到底有什么作用呢?我会用一个简单的例子跟大家说明。
请看下面的这段代码,Foo类实现了ArrayAccess接口中的四个方法,请仔细看这些方法内部的实现代码。看到了吗?这些代码是干什么用的,回答就是这些代码没有用,随便你怎么写,你想写什么就写什么。接口中这四个方法的内部的实现跟方法名字其实没有任何关系。啊!这。。。实际的作用是取决于你的调用。
class Foo implements ArrayAccess
{
public function offsetExists( $offset ) {
echo "这里是 offsetExists() 方法 你输入的参数是 {$offset}";
} public function offsetGet( $offset ) {
echo "这里是 offsetGet() 方法 你输入的参数是 $offset";
} public function offsetSet( $offset, $value ) {
echo "这里是 offsetSet() 方法 你输入的 {$offset}={$value}";
} public function offsetUnset( $offset ) {
echo "这里是 offsetUnset() 方法 你输入的参数是 {$offset}";
}
}
好,我们调用一下看看。
我们使用isset这个函数去调用$foo['how'],那么实际上是调用了offsetExists这个方法,也就是说 $foo['xxxx'] 这种结构去调用哪个ArrayAccess的方法是取决于你是如何调用的 $foo['xxxx']。而方法内部的实现代码你想怎么写就怎么写。在这里一旦你使用isset去调用了这种结构,系统就会去调用offsetExists这个方法,在本例中方法里面有什么,仅仅是echo了一句话。为什么 var_dump($t); 会输出false呢?因为在我们实现的这个offsetExists方法里面,没有任何的返回值,没有返回值当然就是null了,也就是false了。
$foo = new Foo();
$t = isset($foo['how']);// 输出: 这里是 offsetExists() 方法 你输入的参数是 how
var_dump($t);// 输出: boolean false
接着看看这种 $foo['xxxx'] 结构还可以怎样被调用,不如我们这次直接使用$foo['xxxx']看看。原来直接使用 $foo['xxxx'] 这种结构也可以调用一个方法啊,从输出当中得知调用了offsetGet方法,同样也获取到了参数。
$foo = new Foo();
$foo['what'];// 输出: 这里是 offsetGet() 方法 你输入的参数是 what
继续看还能怎么调用到其他的方法,我们给这个结构赋值看看,果然赋值的操作当然是调用offsetSet方法了,同样的方法内部的实现代码任然还是你想写什么就写什么。
$foo = new Foo();
$foo['when'] = 'today';// 输出: 这里是 offsetSet() 方法 你输入的 when=today
最后一个了,看方法名字也知道是通过unset方法才能被调用了。
$foo = new Foo();
unset($foo['wow']);// 输出: 这里是 offsetUnset() 方法 你输入的参数是 wow
总结
好了,总结一下吧:
如果你的类实现了ArrayAccess接口,那么这个类的对象就可以使用$foo['xxx']这种结构了。
$foo['xxx'] 对应调用offsetGet方法。
$foo['xxx'] = 'yyy' 对应调用offsetSet方法。
isset($foo['xxx']) 对应调用offsetExists方法。
unset($foo['xxx']) 对应调用offsetUnset方法。
再次强调,方法的实现代码,你想怎么写就怎么写。(当然代码的功能最好是贴近方法名啦)
原创内容,禁止转载!
PHP中的ArrayAccess用法详解的更多相关文章
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- php中setcookie函数用法详解(转)
php中setcookie函数用法详解: php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见. 语法: bool set ...
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- Mysql中limit的用法详解
Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...
- JavaScript中this的用法详解
JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...
- (转)Shell中read的用法详解
Shell中read的用法详解 原文:http://blog.csdn.net/jerry_1126/article/details/77406500 read的常用用法如下: read -[pstn ...
- (转)linux 中特殊符号用法详解
linux 中特殊符号用法详解 原文:https://www.cnblogs.com/lidabo/p/4323979.html # 井号 (comments)#管理员 $普通用户 脚本中 #!/b ...
- CentOS 7.X 中systemctl命令用法详解
systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体.可以使用它永久性或只在当前会话中启用/禁用服务,下面来看CentOS 7.X 中 ...
随机推荐
- pycharm安装,svn使用,远程开发调试,接口测试,连接服务器
磨刀不误砍柴工,配置完美的编辑器,在开发时,能帮助我们节约大量的时间成本,从而是我们的精力放在业务逻辑实现上面! 接下来将介绍 使用pyhcarm如何使用svn,远程开发调试,接口测试,已经连接远程服 ...
- ACL访问控制列表
acl是基于文件系统的,所以支不支持acl在于使用什么文件系统. FAT32文件系统不支持权限,也不区分大小写 如果一个分区不是安装系统时分的分区,是一个新的分区的话,默认是不支持acl CentOS ...
- Linux基础二
linux命令分类 内部命令:属于shell解释器 外部命令:独立于shell解释器 检查命令类型 type:检查命令字的类型 [root@localhost ~]# type ls ls 是 `ls ...
- dojo表格的一些属性
dojo表格的属性总结归纳 1.表格无数据提示 data-dojo-props="noDataMessage:'无数据...'" 2.表格的高度自动适应 autoHeight=&q ...
- php simpleXML操作xml的用法
XML简介 XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据.在实际应用中,一些简单的.安全性较低的数据往往使用 XML文件的格式进行存储.这样做的好处一方面可以通过减少与数据库的交 ...
- HighCharts之2D半圆环图
HighCharts之2D半圆环图 1.实例源码 HalfDonut.html: <!DOCTYPE html> <html> <head> <meta ch ...
- “var arr = []; ”和 “var arr = {};” 的区别
1.面试题 var arr = []; var arr = {}; 比较上述代码有什么区别? 2.解析 var arr = [];是一个数组对象 var arr = {} ...
- Python实现一些常用排序算法
一些常用的排序 #系统内置排序算法#list.sort()#heapq模块 def sys_heap_sort(list): import heapq heap = [] for i in range ...
- js中的回调函数的理解
一,常见的但是不是特别注意的回调方法. 1.1,ajax $.ajax({ url:"test.json", type: "GET", data: {usern ...
- 第二个scala程序
计算昨日收益,读取hdfs文件,使用临时表sqlcontext进行计算,结果保存于mysql中. 之前考虑过将结果存储于Hbase中,由于各种原因及问题,在加上数据量真的很小很小,就改成mysql了. ...