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 相关文章推荐
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
详解YII关联查询
Jan 10 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
Yii2框架制作RESTful风格的API快速入门教程
Nov 08 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
php利用ob_start()清除输出和选择性输出的方法
Jan 18 PHP
如何通过PHP实现Des加密算法代码实例
May 09 PHP
laravel开发环境homestead搭建过程详解
Jul 03 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
php mssql 时间格式问题
2009/01/13 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
jQuery 表单验证扩展(四)
2010/10/20 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python list删除元素时要注意的坑点分享
2018/04/18 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
利用Python写一个爬妹子的爬虫
2018/06/08 Python
使用python 3实现发送邮件功能
2018/06/15 Python
python实现多张图片拼接成大图
2019/01/15 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
django实现日志按日期分割
2020/05/21 Python
python 用struct模块解决黏包问题
2020/11/07 Python
秋季运动会稿件
2014/01/30 职场文书
海飞丝广告词
2014/03/20 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫