ArrayAccess(數組式訪問)接口:提供像訪問數組同樣訪問對象的能力的接口。php
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 ); }
若是咱們想像數組同樣來訪問你的PHP對象只須要實現ArrayAccess接口便可mysql
場景:假如我有一個User類,映射的是用戶的信息,想經過數組的方式來訪問和設置用戶信息sql
<?php /** * Created by PhpStorm. * User: moell * Date: 16-10-30 * Time: 下午8:49 */ namespace User; class User implements \ArrayAccess { private $data = []; public function __construct() { $this->data = [ 'name' => 'moell', 'sex' => '男', 'email' => 'moell@gmail.com' ]; } /** * 檢查指定字段數據是否存在 * * @param $offset * @return bool */ public function offsetExists($offset) { return isset($this->data[$offset]); } /** * 獲取指定字段數據 * * @param $offset * @return mixed */ public function offsetGet($offset) { return $this->data[$offset]; } /** * 設置指定字段數據 * * @param $offset * @param $value * @return mixed */ public function offsetSet($offset, $value) { return $this->data[$offset] = $value; } /** * 刪除指定字段數據 * * @param $offset */ public function offsetUnset($offset) { unset($this->data[$offset]); } } $user = new User(); //獲取用戶的email echo $user['email'].PHP_EOL; // moell@gmail.com //檢查age是否存在 var_dump(isset($user['age'])); // bool(false) //設置age $user['age'] = 18; echo $user['age'].PHP_EOL; //18 //刪除age unset($user['age']); var_dump(isset($user['age'])); // bool(false)
咱們的對象能夠像數組同樣操做了,是否是很神奇呢?數組
在咱們構建應用中,常常會經過一個配置文件變動程序的一個行爲,經過ArrayAccess咱們會更輕鬆的實現。app
下面我帶大家一塊兒看看我是這麼實現的ui
1. 在項目更目錄下建立一個config目錄
2. 在config目錄下建立相應的配置文件,好比app.php 和 database.php。文件程序以下this
app.phpspa
<?php return [ 'name' => 'app name', 'version' => 'v1.0.0' ];
database.phpcode
<?php return [ 'mysql' => [ 'host' => 'localhost', 'user' => 'root', 'password' => '12345678' ] ];
3. Config.php實現ArrayAccessorm
<?php namespace Config; class Config implements \ArrayAccess { private $config = []; private static $instance; private $path; private function __construct() { $this->path = __DIR__."/config/"; } public static function instance() { if (!(self::$instance instanceof Config)) { self::$instance = new Config(); } return self::$instance; } public function offsetExists($offset) { return isset($this->config[$offset]); } public function offsetGet($offset) { if (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::instance(); //獲取app.php 文件的 name echo $config['app']['name'].PHP_EOL; //app name //獲取database.php文件mysql的user配置 echo $config['database']['mysql']['user'].PHP_EOL; // root
若是你給我同樣熱愛PHP,歡迎加入QQ羣:339803849一塊兒討論
文章轉載說明出處,本文地址:http://moell.cn/article/29