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 相关文章推荐
使用MaxMind 根据IP地址对访问者定位
Oct 09 PHP
ADODB类使用
Nov 25 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
PHP strncasecmp字符串比较的小技巧
Jan 04 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
smarty简单应用实例
Nov 03 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
laravel 如何实现引入自己的函数或类库
Oct 15 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
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
php短信接口代码
2016/05/13 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
jQuery基础知识小结
2014/12/22 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
vue组件的写法汇总
2018/04/12 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python滑块验证码的破解实现
2019/11/10 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
工厂清洁工岗位职责
2015/02/14 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
virtualenv隔离Python环境的问题解析
2022/06/21 Python
如何利用python实现Simhash算法
2022/06/28 Python