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 相关文章推荐
怎么使 Mysql 数据同步
Oct 09 PHP
php代码把全角数字转为半角数字
Dec 10 PHP
PHP中读写文件实现代码
Oct 20 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
php字符串过滤与替换小结
Jan 26 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
Dec 28 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
jquery uaMatch源代码
2011/02/14 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
React组件中的this的具体使用
2018/02/28 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
简单介绍Python中的decode()方法的使用
2015/05/18 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python编写分类决策树的代码
2017/12/21 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
python 利用zmail库发送邮件
2020/09/11 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
详解CSS3:overflow属性
2020/11/17 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
法律专业自我鉴定
2013/10/03 职场文书
酒吧副总经理岗位职责
2013/12/10 职场文书
国庆节标语大全
2014/10/08 职场文书
民主评议党员个人总结
2015/02/13 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏