以前对ArrayAccess不是很熟悉,现在整理下下有关ArrayAccess相关的知识,ArrayAccess接口就是提供像访问数组一样访问对象的能力的接口。

接口内容如下:

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
namespace lib;
use mpf\core\Di;
class config implements \ArrayAccess{

//定义存储数据的数组
protected $configs;
public function __construct($configs){
  $this->configs = $configs;
  $configs = \lib\model\Home::getWebConfig();
  foreach( $configs as $config ){
    if( !isset($this->configs[$config['sc_key']]) ){
    $this->configs[$config['sc_key']] = $config['sc_content'];
    }
  }
}
public function get($key){
  if( isset($this->configs[$key]) ){
    return $this->configs[$key];
  }elseif( $key == 'caipiao'){
    $this->configs['caipiao'] = \lib\model\Home::getLcs();
    return $this->configs[$key];
  }elseif( $key == 'user_money' ){
    if( isset($_SESSION['uid']) ){
  if( $_SESSION['utype'] == 5 ){
    $sql = 'select money from inner_user where uid=?';
  }else{
    $sql = 'select money from user where uid=?';
  }
    $this->configs['user_money'] = \mpf\core\Di::$Di->db->prepare_query($sql,[getUid()])->fetch(\PDO::FETCH_COLUMN);
    return $this->configs['user_money'];
  }
}
}
public function offsetExists($index){
  return isset($this->configs[$index]);
}
public function offsetGet($index){
  return $this->configs[$index];
}
public function offsetSet($index,$val){
  $this->configs[$index] = $val;
}
public function offsetUnset($index){
  unset($this->configs[$index]);
}
}

这样可以使用config对象来直接访问配置信息内容。

---------------------------------

配置程序:

我们可以通过ArrayAccess利用配置文件来控制程序。

1. 在项目更目录下创建一个config目录 
2. 在config目录下创建相应的配置文件,比如app.php 和 database.php。文件程序如下

app.php

<?php

return [
'name' => 'app name',
'version' => 'v1.0.0'
];

database.php

<?php

return [
'mysql' => [
'host' => 'localhost',
'user' => 'root',
'password' => '12345678'
]
];

3. Config.php实现ArrayAccess

<?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

数组式访问-ArrayAccess的更多相关文章

  1. ArrayAccess(数组式访问)

    实现该接口后,可以像访问数组一样访问对象. 接口摘要: ArrayAccess { abstract public boolean offsetExists ( mixed $offset ) abs ...

  2. php使用数组语法访问对象

    有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决. 使用场景:加载配置文件类.larvel框架加载配置文件就这利用数组来操作对象. 数组式访问Obj ...

  3. 模拟jquery链式访问

    一直写代码写代码,博客都快荒废了,眼看一月要过完,不能不留下点记忆,嘿嘿,刚研究了下jquery的链式访问,这么好用的技能我赶紧get了下,研究后略微修改,模拟一个简单的链式访问,下面这段代码支持修改 ...

  4. C# 类如何声明索引器以提供对类的类似数组的访问的代码

    研发期间,将内容过程中比较常用的内容段做个收藏,如下内容内容是关于 C# 类如何声明索引器以提供对类的类似数组的访问.的内容,希望能对各位有用处. using System;using System. ...

  5. ruby中的链式访问和方法嵌套

    先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...

  6. C语言中的数组的访问方式

    闲下来,写的代码,很是简单,不解释,代码如下: #include <stdio.h> int main(int argc, char **argv) { char cArray[] = & ...

  7. 阿里云虚拟主机针对恶意频繁攻击式访问造成CPU爆满的解决方法

    最近网站CPU经常爆满,到阿里云提交了工单,工程师给我的处理意见:   您好,虚拟主机CPU占用比较高通常这种情况有两种可能:   一是网站应用程序代码逻辑较复杂,或业务架构效率比较低,在请求了某个网 ...

  8. (C/C++学习)7.数组及其访问方式

    说明:数组的数据类型是一种构造类型,而存储数组的内存是一段连续的存储区域.数组的数据类型决定了连续内存的访问方式,它包括数组的三要素:起始地址.步长以及元素个数. 一.一维数组 1.形式:type 数 ...

  9. android JNI 一维数组、二维数组的访问与使用

    在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...

随机推荐

  1. Shell-5--位置参数变量

  2. 机器学习基石笔记:09 Linear Regression

    线性回归假设: 代价函数------均方误差: 最小化样本内代价函数: 只有满秩方阵才有逆矩阵. 线性回归算法流程: 线性回归算法是隐式迭代的. 线性回归算法泛化可能的保证: 根据矩阵的迹的性质:tr ...

  3. docker环境 宿主机和容器之间复制文件

    容器往宿主机:docker cp 3234234324234:/database_dump_bak/db_bak.dmp /home/test 宿主机往容器:docker cp wenjian_001 ...

  4. 为什么我们喜欢用 sigmoid 这类 S 型非线性变换?

    本文整理自 @老师木 的一条图片新浪微博,从另一个角度给出为何采用 sigmoid 函数作非线性变换的解释. 为什么我们喜欢用 sigmoid 这类 S 型非线性变换?

  5. MySQL笔记(7)---事务

    1.前言 前面具体讲了MySQL中的锁实现的方式,解释了是如何保证数据在并发情况下的可靠性,并提到了事务REPETABLE READ和READ COMMITTED,解释了一下这两种事务的不同.本章讲具 ...

  6. abstract、virtual、sealed、 interface、struct 基础知识整理

    abstract abstract 修饰符指示被修改内容的实现已丢失或不完整. abstract 修饰符可用于类.方法.属性.索引和事件. 在类声明中使用 abstract修饰符以指示某个类仅旨在作为 ...

  7. Spring Boot 集成 Swagger2 与配置 OAuth2.0 授权

    Spring Boot 集成 Swagger2 很简单,由于接口采用了OAuth2.0 & JWT 协议做了安全验证,使用过程中也遇到了很多小的问题,多次尝试下述配置可以正常使用. Maven ...

  8. Android的Touch事件分发机制简单探析

    前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClic ...

  9. 给recycleview加headview

    参考了https://blog.csdn.net/qibin0506/article/details/49716795 由于recycleview没有直接添加头部view的api,所以需要我们自己去添 ...

  10. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

    登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等. 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验 ...