在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方法。

再次强调,方法的实现代码,你想怎么写就怎么写。(当然代码的功能最好是贴近方法名啦)

原创内容,禁止转载!

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 中 ...

随机推荐

linux操作命令

cd / 回到跟目录 cd ..  返回上一层目录 tomcat 的logs目录执行tail -f catalina.out查看日志 ps -ef|grep tomcat 查看tomcat进程 kil ...

Go语言实现简单的一个静态WEB服务器

package main import ( "net/http" ) func main() { http.Handle("/", http.FileServe ...

东大OJ-1588: Routing Table

题目描述 In the computer network, a Router is a device which finds an optimal way to transmit the datagr ...

BZOJ1107 : [POI2007]驾驶考试egz

i可以作为起点说明把边反向后可以从1和n到达i. 设fl[i]表示从1到达i至少需要加几条边,fr[i]表示从n到达i至少需要加几条边. 把图上下翻转后,从左往右依次计算fl[i],有fl[i]=i- ...

JavaScript实现弹框

提起JS弹框,我首先想到的是Alert,然后想到的还是Alert,最后我竟然就只知道Alert.然后面试就死在这个Alert上了.恼火. 根据网上各位大神的总结,我整理了一下,也顺便学习了一下. 一. ...

图解zookeeper FastLeader选举算法

zookeeper当配置为群集模式,在启动或异常情况将被选举为的例子Leader.默认选择算法FastLeaderElection. 不知道zookeeper够考虑这样一个问题:某个服务能够配置为多个 ...

【转】TCP/IP协议中TCP和UDP的区别

TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

MS SQL 事物日志传送能否跨数据库版本吗?

SQL SERVER的事物日志传送(log shipping)功能,相信很多人都使用过或正在应用,这是MS SQL提供的一个非常强大的功能,一般需要一个主数据库服务器(primary/producti ...

[转]tomcat启动报错too low setting for -Xss

tomcat启动报错too low setting for -Xss 网上给的答案都是调整Xss参数,其实不是正确的做法, -Xss:每个线程的Stack大小,“-Xss 15120” 这使得tomc ...

基于TensorFlow的MNIST数据集的实验

一.MNIST实验内容 MNIST的实验比较简单,可以直接通过下面的程序加上程序上的部分注释就能很好的理解了,后面在完善具体的相关的数学理论知识,先记录在这里: 代码如下所示: import tens ...

php arrayaccess什么作用,PHP中的ArrayAccess用法详解相关推荐

  1. linux中tail命令的作用,Linux中tail命令用法详解

    tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...

  2. c语言getline作用,C++中getline()的用法详解

    getline()用法 getline是C++标准库函数:它有两种形式,一种是头文件< istream >中输入流成员函数:一种在头文件< string >中普通函数: 它遇到 ...

  3. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

  4. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

  5. access中的Format用法详解

    access中的Format用法详解 Format$(Now,"EEOA") 只要这么一句~~~~~就可以得到" 二○○六年五月二十六日" ---------- ...

  6. php中socket的使用,php中socket的用法详解,phpsocket详解_PHP教程

    php中socket的用法详解,phpsocket详解 本文实例详细讲述了php中socket的用法,分享给大家供大家参考.具体用法如下: 一.开启socket phpinfo();查看是否开启了so ...

  7. python中permute_PyTorch中permute的用法详解

    PyTorch中permute的用法详解 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: i ...

  8. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  10. C#中NameValueCollection类用法详解

    C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...

最新文章

  1. 如何在html中选择wrap,使用jQuery中的wrap()函数操作HTML元素的教程
  2. 某集团公司信息化项目经验总结
  3. 基于形态学操作提取水平和垂直线条(五线谱中音符和乐谱线的分离)
  4. SpringBoot使用mybatis
  5. SpringAMQP--发布订阅模型介绍
  6. 解决vue项目在ie浏览器中不显示的问题
  7. golang chan 探究
  8. 黑科技揭秘:眼科大夫如何应用5G+8K完成远程会诊?
  9. 实例解析网络编程中的另类内存泄漏
  10. 中国风海报设计必备的墨染素材!点睛国潮风!
  11. win10下pycharm+Qtdesigner+Pyqt 成功配置
  12. TensorFlow中数据读取—如何载入样本
  13. 英伟达新开源GPU加速平台:主打数据科学和机器学习,50倍于CPU
  14. 数据实验室:让您的数据获得真正的价值
  15. 简单解决新浪博客“您短时间发表文章过多,请稍后再试”的问题
  16. Eclipse之Android开发环境搭建
  17. 浙江大学吴朝晖:脑机融合系统综述
  18. [usaco3.2.4]ratios
  19. 【贪心算法】-背包问题
  20. 信用社pb通用记账_2018年农村信用社高频考点:会计账户

热门文章

  1. Google 2016开发者大会
  2. 格式化的硬盘能恢复吗 硬盘格式化以后能恢复吗
  3. 中南OJ 2012年8月月赛 I题 Imagination
  4. 登录爬取拉勾网2.0 Python selenium
  5. python发送邮件群发软件_python使用tkinter写的邮件群发软件-python图形界面编程
  6. Unity游戏开发中大数值显示问题
  7. 二叉树给我的人生感悟
  8. 个人所得税分几个等级
  9. allure报告本地执行,显示趋势图
  10. 计算机画图工具怎么缩小图片,win7系统画图工具放大缩小图片的技巧