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 相关文章推荐
从康盛产品(discuz)提取出来的模板类
Jun 28 PHP
关于php连接mssql:pdo odbc sql server
Jul 20 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php判断是否为json格式的方法
Mar 04 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
thinkPHP简单调用函数与类库的方法
Mar 15 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
PHP addslashes()函数讲解
Feb 03 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 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
php5 and xml示例
2006/11/22 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
Vue自定义多选组件使用详解
2020/09/08 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python中元类用法实例
2014/10/10 Python
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
机器学习python实战之手写数字识别
2017/11/01 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
医学专业大学生求职的自我评价
2013/11/27 职场文书
函授毕业自我鉴定
2013/12/19 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
安全生产月活动总结
2014/05/04 职场文书
物理学专业求职信
2014/07/04 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
总结几个非常实用的Python库
2021/06/26 Python