以前对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. python3调用zabbix api

    前言 今天写了一个zabbix api,这里整理一下,过程中自己也学习了一些东西. 需求 我们需要查一个文件内容如下: cat /ops/flume_hosts node1 node2 需要把这个文件 ...

  2. EF6 学习笔记(五):数据库迁移及部署

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 原文地址:Code First Migrations and Deployment 原文主要讲两部分:开发环境下 ...

  3. 推荐使用OpenLiveWriter在cnblogs上写的Blog

    这是我第一个使用OpenLiveWriter在cnblogs上写的Blog.不知道效果如何,但又很多功能我可以采用! 如表格功能:   Open Live Writer Write  on Web 优 ...

  4. Django Model Form

    ModelForm ModelForm结合了Form和Model,将models的field类型映射成forms的field类型,复用了Model和Model验证, 写更少的代码,并且还实现了存储数据 ...

  5. SSD磁盘测试不达标排查

     最近购买了一块4T的Inter_SSD_D3-4510硬盘安装在了一台DELL PowerEdge R640服务器,经过测试发现磁盘和产品手册上描述的性能相差过大,相当于产品手册性能的1/2,一下是 ...

  6. 迁移桌面程序到MS Store(1)——通过Visual Studio创建Packaging工程

    之前跑去做了一年多的iOS开发,被XCode恶心得不行.做人呢,最重要的是开心.所以我就炒了公司鱿鱼,挪了个窝回头去做Windows开发了.        UWP什么的很久没有正儿八经写了,国内的需求 ...

  7. 《http权威指南》读书笔记3

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  8. C#基础-gc算法

    众所周知,c++是需要程序员手动管理内存的,然而手动释放内存很容易被程序员遗漏,从而导致资源浪费或内存泄露.为解决这个问题,垃圾回收器诞生了,代替程序员自动管理内存的释放.至于gc算法则是垃圾回收器清 ...

  9. ubuntu 16.04 下更换boost版本

    如果是新机器,没装过boost,那么直接一条命令 sudo apt-get install libboost-all-dev 头文件一般安装在 /usr/include 下面有一个目录boost,里面 ...

  10. Java线程池种类、区别和适用场景

    newCachedThreadPool: 底层:返回ThreadPoolExecutor实例,corePoolSize为0:maximumPoolSize为Integer.MAX_VALUE:keep ...