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 相关文章推荐
理解PHP5中static和const关键字的区别
Mar 19 PHP
php 在线打包_支持子目录
Jun 28 PHP
如何使用Strace调试工具
Jun 03 PHP
php实现的一个很好用HTML解析器类可用于采集数据
Sep 23 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
PHP实现的简单缓存类
Jul 29 PHP
CI框架扩展系统核心类的方法分析
May 23 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
解析php5配置使用pdo
2013/07/03 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
python hook监听事件详解
2018/10/25 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
大学毕业生求职自荐信
2014/02/20 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
离婚协议书格式范本
2016/03/18 职场文书
如何用python反转图片,视频
2021/04/24 Python
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
详解PyTorch模型保存与加载
2022/04/28 Python
MySQL 语句执行顺序举例解析
2022/06/05 MySQL