简介
- 提供像访问数组同样访问对象的能力的接口。
接口摘要
ArrayAccess { /* 方法 */ abstract public boolean offsetExists ( mixed $offset ) abstract public mixed offsetGet ( mixed $offset ) abstract public void offsetSet ( mixed $offset , mixed $value ) abstract public void offsetUnset ( mixed $offset ) }
目录
- ArrayAccess::offsetExists — 检查一个偏移位置是否存在
- ArrayAccess::offsetGet — 获取一个偏移位置的值
- ArrayAccess::offsetSet — 设置一个偏移位置的值
- ArrayAccess::offsetUnset — 复位一个偏移位置的值
代码演示php
class Obj implements ArrayAccess { private $container = []; public function offsetExists($offset): bool { echo '调用' . __METHOD__ . '方法' . PHP_EOL; echo print_r(func_get_args(), true); return isset($this->container[$offset]); } public function offsetGet($offset) { echo '调用' . __METHOD__ . '方法' . PHP_EOL; echo print_r(func_get_args(), true); return $this->container[$offset] ?? null; } public function offsetSet($offset, $value) { echo '调用' . __METHOD__ . '方法' . PHP_EOL; echo print_r(func_get_args(), true); $this->container[$offset] = $value; } public function offsetUnset($offset) { echo '调用' . __METHOD__ . '方法' . PHP_EOL; echo print_r(func_get_args(), true); unset($this->container[$offset]); } } //实例化对象 $zhangsan = new Obj(); //赋值 $zhangsan['name'] = '张三';//调用Obj::offsetSet方法 //输出 echo $zhangsan['name'] . PHP_EOL;//调用Obj::offsetGet方法 //校验是否存在 isset($zhangsan['name']) . PHP_EOL;//调用Obj::offsetExists方法 //删除数组单元 unset($zhangsan['name']);//调用Obj::offsetUnset方法
经过调用接口方法来实现对对象属性进行操做,而后使用数组的方式访问mysql
$zhangsan=new Obj(); if ($zhangsan instanceof \ArrayAccess) { //经过调用接口方法为对象赋值 $zhangsan->offsetSet('name', '张三'); //经过数组方式取值 echo $zhangsan['name'] . PHP_EOL; //经过调用接口方法取值 echo $zhangsan->offsetGet('name').PHP_EOL; //经过调用接口方法来判断对象属性是否存在 if (!$zhangsan->offsetExists('age') && !isset($zhangsan['age'])) { $zhangsan->offsetSet('age', '18'); } $zhangsan['address']='北京'; //经过调用接口方法来判断对象属性 $zhangsan->offsetUnset('address'); echo $zhangsan['address'] ?? 'address is not exists'; //直接为对象属性赋值(不可行) $zhangsan->school='Peking University'; echo $zhangsan['school'] ?? 'school is not exists';//school is not exists }
应用案例演示 sql
实现配置文件信息读取数组
按照一下给出的目录结构创建文件app
./ ├── config │ ├── app.php │ └── database.php └── config.php
./config/app.phpide
<?php return [ 'name' => 'app name', 'version' => 'v1.0.0' ];
./config/database.phpui
<?php return [ 'mysql' => [ 'host' => 'localhost', 'user' => 'root', 'password' => '12345678' ] ];
<?php namespace Config; final Class Config implements \ArrayAccess { private $config = []; private static $instance = null; private $path = null; private function __construct() { $this->path = __DIR__ . '/config/'; } //单例模式获取实例 public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } //防止被克隆 private function __clone() { } public function offsetExists($offset) { return isset($this->config[$offset]); } public function offsetGet($offset) { if (!isset($this->config[$offset]) || empty($this->config[$offset])) { //装载配置文件 $this->config[$offset] = require $this->path . $offset . '.php'; } return $this->config[$offset]; } public function offsetSet($offset, $value) { throw new \Exception('不提供设置配置'); } public function offsetUnset($offset) { throw new \Exception('不提供删除配置'); } } $config = Config::getInstance(); //获取app.php 文件的 name echo $config['app']['name'].PHP_EOL; //app name //获取database.php文件mysql的user配置 echo $config['database']['mysql']['user'].PHP_EOL; // root