PHP数组式访问接口ArrayAccess用法分析


Posted in PHP onDecember 28, 2017

本文实例讲述了PHP数组式访问接口ArrayAccess用法。分享给大家供大家参考,具体如下:

PHP  ArrayAccess接口又叫数组式访问接口,该接口的作用是提供像访问数组一样访问对象的能力。

接口摘要如下:

ArrayAccess {
  // 获取一个偏移位置的值
  abstract public mixed offsetGet ( mixed $offset )
  // 设置一个偏移位置的值
  abstract public void offsetSet ( mixed $offset , mixed $value )
  // 检查一个偏移位置是否存在
  abstract public boolean offsetExists ( mixed $offset )
  // 复位一个偏移位置的值
  abstract public void offsetUnset ( mixed $offset )
}

例子说明:

<?php
/**
* ArrayAndObjectAccess
* 该类允许以数组或对象的方式进行访问
*
* @author 疯狂老司机
*/
class ArrayAndObjectAccess implements ArrayAccess {
  /**
   * 定义一个数组用于保存数据
   *
   * @access private
   * @var array
   */
  private $data = [];
  /**
   * 以对象方式访问数组中的数据
   *
   * @access public
   * @param string 数组元素键名
   */
  public function __get($key) {
    return $this->data[$key];
  }
  /**
   * 以对象方式添加一个数组元素
   *
   * @access public
   * @param string 数组元素键名
   * @param mixed 数组元素值
   * @return mixed
   */
  public function __set($key,$value) {
    $this->data[$key] = $value;
  }
  /**
   * 以对象方式判断数组元素是否设置
   *
   * @access public
   * @param 数组元素键名
   * @return boolean
   */
  public function __isset($key) {
    return isset($this->data[$key]);
  }
  /**
   * 以对象方式删除一个数组元素
   *
   * @access public
   * @param 数组元素键名
   */
  public function __unset($key) {
    unset($this->data[$key]);
  }
  /**
   * 以数组方式向data数组添加一个元素
   *
   * @access public
   * @abstracting ArrayAccess
   * @param string 偏移位置
   * @param mixed 元素值
   */
  public function offsetSet($offset,$value) {
    if (is_null($offset)) {
      $this->data[] = $value;
    } else {
      $this->data[$offset] = $value;
    }
  }
  /**
   * 以数组方式获取data数组指定位置元素
   *
   * @access public
   * @abstracting ArrayAccess
   * @param 偏移位置
   * @return mixed
   */
  public function offsetGet($offset) {
    return $this->offsetExists($offset) ? $this->data[$offset] : null;
  }
  /**
   * 以数组方式判断偏移位置元素是否设置
   *
   * @access public
   * @abstracting ArrayAccess
   * @param 偏移位置
   * @return boolean
   */
  public function offsetExists($offset) {
    return isset($this->data[$offset]);
  }
  /**
   * 以数组方式删除data数组指定位置元素
   *
   * @access public
   * @abstracting ArrayAccess
   * @param 偏移位置
   */
  public function offsetUnset($offset) {
    if ($this->offsetExists($offset)) {
      unset($this->data[$offset]);
    }
  }
}
$animal = new ArrayAndObjectAccess();
$animal->dog = 'dog'; // 调用ArrayAndObjectAccess::__set
$animal['pig'] = 'pig'; // 调用ArrayAndObjectAccess::offsetSet
var_dump(isset($animal->dog)); // 调用ArrayAndObjectAccess::__isset
var_dump(isset($animal['pig'])); // 调用ArrayAndObjectAccess::offsetExists
var_dump($animal->pig); // 调用ArrayAndObjectAccess::__get
var_dump($animal['dog']); // 调用ArrayAndObjectAccess::offsetGet
unset($animal['dog']); // 调用ArrayAndObjectAccess::offsetUnset
unset($animal->pig); // 调用ArrayAndObjectAccess::__unset
var_dump($animal['pig']); // 调用ArrayAndObjectAccess::offsetGet
var_dump($animal->dog); // 调用ArrayAndObjectAccess::__get
?>

以上输出:

boolean true
boolean true
string 'pig' (length=3)
string 'dog' (length=3)
null
null

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
PHP共享内存用法实例分析
Feb 12 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
再谈PHP中单双引号的区别详解
Jun 12 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PHP后门隐藏的一些技巧总结
Nov 04 PHP
PHP7 参数处理机制修改
Mar 09 PHP
PHP获取数组中指定的一列实例
Dec 27 #PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 #PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 #PHP
Laravel中使用Queue的最基本操作教程
Dec 27 #PHP
php获取ajax的headers方法与内容实例
Dec 27 #PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 #PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 #PHP
You might like
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
取得父标签
2006/11/14 Javascript
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
微信小程序支付前端源码
2018/08/29 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
Python部署web开发程序的几种方法
2017/05/05 Python
详解K-means算法在Python中的实现
2017/12/05 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
python和go语言的区别是什么
2020/07/20 Python
python+requests接口自动化框架的实现
2020/08/31 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
尽职尽责村干部自我鉴定
2014/01/23 职场文书
学校大课间活动方案
2014/01/30 职场文书
读书演讲主持词
2014/03/18 职场文书
2014年政工师工作总结
2014/12/18 职场文书
学年个人总结范文
2015/03/05 职场文书
职位证明模板
2015/06/23 职场文书
导游词之无锡梅园
2019/11/28 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
15个值得收藏的JavaScript函数
2021/09/15 Javascript
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫