当前位置:首页 > PHP教程 > php数组 > 列表

PHP数组式访问接口ArrayAccess用法分析

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-17 09:44:10 浏览: 评论:0 

本文实例讲述了PHP数组式访问接口ArrayAccess用法。分享给大家供大家参考,具体如下:

PHP  ArrayAccess接口又叫数组式访问接口,该接口的作用是提供像访问数组一样访问对象的能力。

接口摘要如下:

  1. ArrayAccess { 
  2.   // 获取一个偏移位置的值 
  3.   abstract public mixed offsetGet ( mixed $offset ) 
  4.   // 设置一个偏移位置的值 
  5.   abstract public void offsetSet ( mixed $offset , mixed $value ) 
  6.   // 检查一个偏移位置是否存在 
  7.   abstract public boolean offsetExists ( mixed $offset ) 
  8.   // 复位一个偏移位置的值 
  9.   abstract public void offsetUnset ( mixed $offset ) 

例子说明:

  1. <?php 
  2. /** 
  3. * ArrayAndObjectAccess 
  4. * 该类允许以数组或对象的方式进行访问 
  5. * 
  6. * @author 疯狂老司机 
  7. */ 
  8. class ArrayAndObjectAccess implements ArrayAccess { 
  9.   /** 
  10.    * 定义一个数组用于保存数据 
  11.    * 
  12.    * @access private 
  13.    * @var array 
  14.    */ 
  15.   private $data = []; 
  16.   /** 
  17.    * 以对象方式访问数组中的数据 
  18.    * 
  19.    * @access public 
  20.    * @param string 数组元素键名 
  21.    */ 
  22.   public function __get($key) { 
  23.     return $this->data[$key]; 
  24.   } 
  25.   /** 
  26.    * 以对象方式添加一个数组元素 
  27.    * 
  28.    * @access public 
  29.    * @param string 数组元素键名 
  30.    * @param mixed 数组元素值 
  31.    * @return mixed 
  32.    */ 
  33.   public function __set($key,$value) { 
  34.     $this->data[$key] = $value
  35.   } 
  36.   /** 
  37.    * 以对象方式判断数组元素是否设置 
  38.    * 
  39.    * @access public 
  40.    * @param 数组元素键名 
  41.    * @return boolean 
  42.    */ 
  43.   public function __isset($key) { 
  44.     return isset($this->data[$key]); 
  45.   } 
  46.   /** 
  47.    * 以对象方式删除一个数组元素 
  48.    * 
  49.    * @access public 
  50.    * @param 数组元素键名 
  51.    */ 
  52.   public function __unset($key) { 
  53.     unset($this->data[$key]); 
  54.   } 
  55.   /** 
  56.    * 以数组方式向data数组添加一个元素 
  57.    * 
  58.    * @access public 
  59.    * @abstracting ArrayAccess 
  60.    * @param string 偏移位置 
  61.    * @param mixed 元素值 
  62.    */ 
  63.   public function offsetSet($offset,$value) { 
  64.     if (is_null($offset)) { 
  65.       $this->data[] = $value
  66.     } else { 
  67.       $this->data[$offset] = $value
  68.     } 
  69.   } 
  70.   /** 
  71.    * 以数组方式获取data数组指定位置元素 
  72.    * 
  73.    * @access public 
  74.    * @abstracting ArrayAccess 
  75.    * @param 偏移位置 
  76.    * @return mixed 
  77.    */ 
  78.   public function offsetGet($offset) { 
  79.     return $this->offsetExists($offset) ? $this->data[$offset] : null; 
  80.   } 
  81.   /** 
  82.    * 以数组方式判断偏移位置元素是否设置 
  83.    * 
  84.    * @access public 
  85.    * @abstracting ArrayAccess 
  86.    * @param 偏移位置 
  87.    * @return boolean 
  88.    */ 
  89.   public function offsetExists($offset) { 
  90.     return isset($this->data[$offset]); 
  91.   } 
  92.   /** 
  93.    * 以数组方式删除data数组指定位置元素 
  94.    * 
  95.    * @access public 
  96.    * @abstracting ArrayAccess 
  97.    * @param 偏移位置 
  98.    */ 
  99.   public function offsetUnset($offset) { 
  100.     if ($this->offsetExists($offset)) { 
  101.       unset($this->data[$offset]); 
  102.     } 
  103.   } 
  104. //phpfensi.com 
  105. $animal = new ArrayAndObjectAccess(); 
  106. $animal->dog = 'dog'// 调用ArrayAndObjectAccess::__set 
  107. $animal['pig'] = 'pig'// 调用ArrayAndObjectAccess::offsetSet 
  108. var_dump(isset($animal->dog)); // 调用ArrayAndObjectAccess::__isset 
  109. var_dump(isset($animal['pig'])); // 调用ArrayAndObjectAccess::offsetExists 
  110. var_dump($animal->pig); // 调用ArrayAndObjectAccess::__get 
  111. var_dump($animal['dog']); // 调用ArrayAndObjectAccess::offsetGet 
  112. unset($animal['dog']); // 调用ArrayAndObjectAccess::offsetUnset 
  113. unset($animal->pig); // 调用ArrayAndObjectAccess::__unset 
  114. var_dump($animal['pig']); // 调用ArrayAndObjectAccess::offsetGet 
  115. var_dump($animal->dog); // 调用ArrayAndObjectAccess::__get 
  116. ?> 

以上输出:

  1. boolean true 
  2. boolean true 
  3. string 'pig' (length=3) 
  4. string 'dog' (length=3) 
  5. null 
  6. null 

Tags: 数组 接口

分享到: