在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用法详解的更多相关文章

  1. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

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

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

  3. php中setcookie函数用法详解(转)

    php中setcookie函数用法详解:        php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见.        语法:        bool set ...

  4. JavaScript中return的用法详解

    JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...

  5. Mysql中limit的用法详解

    Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...

  6. JavaScript中this的用法详解

    JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...

  7. (转)Shell中read的用法详解

    Shell中read的用法详解 原文:http://blog.csdn.net/jerry_1126/article/details/77406500 read的常用用法如下: read -[pstn ...

  8. (转)linux 中特殊符号用法详解

    linux 中特殊符号用法详解 原文:https://www.cnblogs.com/lidabo/p/4323979.html # 井号 (comments)#管理员  $普通用户 脚本中 #!/b ...

  9. CentOS 7.X 中systemctl命令用法详解

    systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体.可以使用它永久性或只在当前会话中启用/禁用服务,下面来看CentOS 7.X 中 ...

随机推荐

  1. Linux基础五

    Yum软件包管理 yum:基于rpm包构建的软件更新机制 自动解决软件包依赖关系 所有软件包由集中的yum软件仓库提供. [root@hydra桌面]#ls /misc/cd/repodata/ (r ...

  2. 一句Python,一句R︱数据的合并、分组、排序、翻转

    先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. python中的numpy模块相当于R中的matirx矩 ...

  3. Mongodb3.0.5副本集搭建及spring和java连接副本集配置

    这是去年写的一篇文档,最近突然发现并没有发不出来,因此现在补上,希望能对某些朋友有所帮助.因为当时记录时没有截图,因此这里看起来可能就比较单调. 一.基本环境: mongdb3.0.5数据库 spri ...

  4. sublime Xdebug 配置

    Sublime Text 配置x-debug 配置php 的x-debug 拓展 下载地址 :http://www.xdebug.org/download.php 放到php ext的目录下 然后使用 ...

  5. 安装sphinx和coreseek

    sphinx简介 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数 ...

  6. apache和tomcat公用80端口

    原理主要利用apache的代理. 第一步:修改apache的httpd.conf配置文件. 首先,要让apache支持转发也就是做tomcat的代理那么就要先启用apache的代理模块.首先我在Apa ...

  7. lwip Light Weight (轻型)IP协议

    wip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈. 外文名 lwip 开发者 瑞典计算机科学院 说    明 Light Weight (轻型)I ...

  8. Unhandled event loop exception GC overhead limit exceeded

    1.错误描述 java.lang.OutOfMemoryError: GC overhead limit exceeded at java.util.zip.ZipFile.<init>( ...

  9. Tomcat下使用Druid配置JNDI数据源

    com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置. 一.下载D ...

  10. Web开发工具——Jupyter notebook

    jupyter-notebook 安装及远程访问 Introduction Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程 ...