为什么80%的码农都做不了架构师?>>>   

PHP数组式访问接口ArrayAccess技术

maybe yes 发表于2015-04-23 22:34

原文链接 : http://blog.lmlphp.com/archives/108/PHP_object_array-type_access_interface_implements_ArrayAccess  来自 : LMLPHP后院

ArrayAccess 提供像访问数组一样访问对象的能力的接口。看 Web Artisan Laravel 框架的 Illuminate\Container 就实现了 ArrayAccess 接口,这样就可以像操作数组的方式一样来操作对象。这样的语言预定义接口功能很少人知道,即使不知道也不会影响一个程序员的开发和设计。PHP 的设计者们不直接实现这样的接口就是让程序员有更强的能力创造新的行为的对象。

实现了 ArrayAccess 的类需要实现四个抽象方法,分别是 offsetExists, offsetGet, offsetSet, offsetUnset 。当使用 isset($obj['index']), $obj['index'], $obj['index'] = $value, unset($obj['index']) 时,会分别触发这些方法。接口摘要如下:

<?phpArrayAccess {/* 方法 */abstract public boolean offsetExists ( mixed $offset )abstract public mixed offsetGet ( mixed $offset )abstract public void offsetSet ( mixed $offset , mixed $value )abstract public void offsetUnset ( mixed $offset )
}

需要注意的是,array_key_exists() 不会触发 ArrayAccess::offsetExists() 方法。来自 PHP 官网手册:It bit me today, so putting it here in the hope it will help others : If you call array_key_exists() on an object of a class that implements ArrayAccess, ArrayAccess::offsetExists() will NOT be called.

另外的一些注意事项 :
ArrayAccess 和数组是不兼容的,他们是不同的类型;
ArrayAccess 的 index 不局限于字符串和整形,它可以是任何类型;
ArrayAccess 对象以数组方式赋值时,不可以使用引用符号,这样会导致一个致命错误,Fatal error : Cannot assign by reference to overloaded object,可以通过使用定义一个方法来实现引用赋值。
ArrayAccess 对象不支持自增自减操作符,这样会导致一个错误,如下代码示例。

Objects implementing ArrayAccess do not support the increment/decrement operators ++ and --, unlike array() and ArrayObject()<?phpclass MyArray implements ArrayAccess
{// offsetSet, offsetGet etc implemented
}$x = new MyArray() ;
$x[0] = 0 ;
$x[0]++ ; //error 'Indirect modification of overloaded element has no effect'

阅(627)评(0)查看评论

转载于:https://my.oschina.net/hosser/blog/633576

PHP数组式访问接口ArrayAccess相关推荐

  1. php arrayaccess 二维,PHP数组式访问接口ArrayAccess用法分析

    本文实例讲述了PHP数组式访问接口ArrayAccess用法.分享给大家供大家参考,具体如下: PHP  ArrayAccess接口又叫数组式访问接口,该接口的作用是提供像访问数组一样访问对象的能力. ...

  2. php arrayaccess 二维,php的ArrayAccess(数组式访问接口)

    本文中的php版本:PHP Version 7.2.5 php中内置了6个常用的预定义接口,实现某些特定的能力.其中最常用的就是 ArrayAccess 了,像ThinkPHP.yii2.Larave ...

  3. C#中显/隐式实现接口及其访问方法

    在实现接口的时候,VS提供了两个菜单,一个是"实现接口",一个是"显式实现接口",它们到底有何不一样呢 我们来比较一下看看 1.首先假设我们有一个接口 publ ...

  4. linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...

    2012-02-05 wcdj 1, 调试时必需的栈知识 2, 数组非法访问导致内存破坏 调试时必需的栈知识 栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First ...

  5. Visual C#访问接口

    对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的.如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员.但由于接口支持多继承,在多继承中,如果 ...

  6. 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区

    目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...

  7. 【C语言】函数 ---- 函数的嵌套调用和链式访问、函数的声明和定义、变量的声明和定义、函数递归与迭代、递归时的栈溢出问题

    函数 一.函数的嵌套调用和链式访问 1.嵌套调用 2.链式访问 2.1strlen()函数 2.2printf()函数 二.函数的声明和定义 1.函数声明和定义的介绍 2.函数声明和定义的使用 三.变 ...

  8. Postman进阶篇(十二)-在脚本中使用pm对象访问接口响应数据(pm.response.*)

    在之前的文章中介绍过postman中的两个脚本--pre-request script或test script,在这两个脚本中都有使用到pm对象.(pre-request script详细介绍.Tes ...

  9. 链接服务器“xx“的 OLE DB 访问接口 “SQLNCLI“ 返回了消息 “没有活动事务。“

    没有活动事务 链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 解决方案-------使用DCTPing工具检测 1.        双方启动MSDTC ...

最新文章

  1. Android用户界面布局(layouts)
  2. 微盟数据库的涅槃之旅
  3. 李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...
  4. java enummap_Java EnumMap containsValue()方法与示例
  5. 深入入门正则表达式(java) - 1 - 入门基础
  6. 挨踢攻城师必备的路由交换技术
  7. plc控制电机实验报告_基于西门子PLC电动机正反转互锁控制实验报告
  8. 网页音乐播放器 音乐播放器 html+css+js
  9. 2000级2班同学聚会邀请函
  10. centos7 备份系统
  11. word中将英文及数字全部修改为Times New Roman字体
  12. pkg-config
  13. IPC技术与评分卡技术区别
  14. 抖音上线“冬季山货节”,不声不响把拼多多老家“偷了”?
  15. centos7 oracle 打补丁
  16. 缺陷管理工具--Mantis
  17. 整理下使用yum localinstall做离线安装的点
  18. Source-Code-Notebook(源码解析和逐行笔记)
  19. JSON解析格式化工具——非插件(超好用推荐)
  20. 淘客推广如何提高转化率(产品篇)

热门文章

  1. LeetCode 21. Merge Two Sorted Lists--合并2个有序列表--python递归,迭代解法
  2. mysql数据库语句q_mysql数据库命令大全,mysql基本命令大全
  3. mysql 主从复制 position_mysql 主从复制原理及步骤。
  4. maven只打包java目录_ssm项目中maven对resources目录打包的路径_默认路径,自定义路径...
  5. catia 创成钣金设计_弯曲的钣金设计技巧
  6. 聊聊电商系统中常见的9大坑,库存超卖、重复下单、物流单ABA...
  7. Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理
  8. Android Studio编译好的apk放在哪里?
  9. c语言程序设计01,c语言程序设计01.doc
  10. 2020身高体重标准表儿童_2020年儿童标准身高体重表发布,对比看看,你家孩子达标了吗?...