以前对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. Alpha冲刺 - (7/10)

    Part.1 开篇 队名:彳艮彳亍团队组长博客:戳我进入作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 改用更易用的springboot+myb ...

  2. 利用fork创建子进程

    创建如图的进程: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<wait. ...

  3. docker 容器和镜像理解

    1.镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器.容器和镜像是一对一的,一个容器里就运行一个镜像. 1.base镜像----提供了一个基本的操作系统环境,用户可以根据需要安 ...

  4. JS中多维数组的深拷贝的多种实现方式

    因为javascript分原始类型与引用类型(与java.c#类似).Array是引用类型,所以直接用=号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝.另外对一维 ...

  5. .net core mvc发布项目到IIS上出现500错误

    如题,我把.net core mvc项目以应用程序方式挂到IIS默认网站下,结果出现了如下错误:HTTP Error 500.0 - ANCM In-Process Handler Load Fail ...

  6. 4.json解析

    格式 {"name":"zhangsan", "age":18, "books":[{"name": ...

  7. js脚本实现自动上传至github

    概述 如果要进行多次上传,使用git gui也会不方便,所以我总结了一下用npm的simple-git实现自动上传至github的方法.供以后开发时参考,相信对其他人也有用. 前提条件 需要安装nod ...

  8. Swift5 语言指南(一) 关于Swift

    Swift是编写软件的绝佳方式,无论是用于手机,台式机,服务器还是其他任何运行代码的软件.它是一种安全,快速,交互式的编程语言,它将现代语言思维的最佳结合与来自更广泛的Apple工程文化的智慧和来自开 ...

  9. css 如何“画”一个抽奖转盘

    主要描述的是如何运用 css 绘制一个抽奖转盘,并运用原生 js 实现转盘抽奖效果. 先来张效果图: 布局 一般来说,转盘一般有四个部分组成:外层闪烁的灯.内层旋转的圆盘.圆盘上的中奖结果.指针. 所 ...

  10. Testing - 软件测试知识梳理 - 测试用例

    测试用例 是指对一项特定的软件产品进行测试任务的描述,体现测试方案.方法.技术和策略. 内容包括测试目标.测试环境.输入数据.测试步骤.预期结果.测试脚本等,并形成文档. 每个具体测试用例都将包括下列 ...