数组式访问-ArrayAccess
以前对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的更多相关文章
- ArrayAccess(数组式访问)
实现该接口后,可以像访问数组一样访问对象. 接口摘要: ArrayAccess { abstract public boolean offsetExists ( mixed $offset ) abs ...
- php使用数组语法访问对象
有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决. 使用场景:加载配置文件类.larvel框架加载配置文件就这利用数组来操作对象. 数组式访问Obj ...
- 模拟jquery链式访问
一直写代码写代码,博客都快荒废了,眼看一月要过完,不能不留下点记忆,嘿嘿,刚研究了下jquery的链式访问,这么好用的技能我赶紧get了下,研究后略微修改,模拟一个简单的链式访问,下面这段代码支持修改 ...
- C# 类如何声明索引器以提供对类的类似数组的访问的代码
研发期间,将内容过程中比较常用的内容段做个收藏,如下内容内容是关于 C# 类如何声明索引器以提供对类的类似数组的访问.的内容,希望能对各位有用处. using System;using System. ...
- ruby中的链式访问和方法嵌套
先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...
- C语言中的数组的访问方式
闲下来,写的代码,很是简单,不解释,代码如下: #include <stdio.h> int main(int argc, char **argv) { char cArray[] = & ...
- 阿里云虚拟主机针对恶意频繁攻击式访问造成CPU爆满的解决方法
最近网站CPU经常爆满,到阿里云提交了工单,工程师给我的处理意见: 您好,虚拟主机CPU占用比较高通常这种情况有两种可能: 一是网站应用程序代码逻辑较复杂,或业务架构效率比较低,在请求了某个网 ...
- (C/C++学习)7.数组及其访问方式
说明:数组的数据类型是一种构造类型,而存储数组的内存是一段连续的存储区域.数组的数据类型决定了连续内存的访问方式,它包括数组的三要素:起始地址.步长以及元素个数. 一.一维数组 1.形式:type 数 ...
- android JNI 一维数组、二维数组的访问与使用
在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...
随机推荐
- python3调用zabbix api
前言 今天写了一个zabbix api,这里整理一下,过程中自己也学习了一些东西. 需求 我们需要查一个文件内容如下: cat /ops/flume_hosts node1 node2 需要把这个文件 ...
- EF6 学习笔记(五):数据库迁移及部署
EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 原文地址:Code First Migrations and Deployment 原文主要讲两部分:开发环境下 ...
- 推荐使用OpenLiveWriter在cnblogs上写的Blog
这是我第一个使用OpenLiveWriter在cnblogs上写的Blog.不知道效果如何,但又很多功能我可以采用! 如表格功能: Open Live Writer Write on Web 优 ...
- Django Model Form
ModelForm ModelForm结合了Form和Model,将models的field类型映射成forms的field类型,复用了Model和Model验证, 写更少的代码,并且还实现了存储数据 ...
- SSD磁盘测试不达标排查
最近购买了一块4T的Inter_SSD_D3-4510硬盘安装在了一台DELL PowerEdge R640服务器,经过测试发现磁盘和产品手册上描述的性能相差过大,相当于产品手册性能的1/2,一下是 ...
- 迁移桌面程序到MS Store(1)——通过Visual Studio创建Packaging工程
之前跑去做了一年多的iOS开发,被XCode恶心得不行.做人呢,最重要的是开心.所以我就炒了公司鱿鱼,挪了个窝回头去做Windows开发了. UWP什么的很久没有正儿八经写了,国内的需求 ...
- 《http权威指南》读书笔记3
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- C#基础-gc算法
众所周知,c++是需要程序员手动管理内存的,然而手动释放内存很容易被程序员遗漏,从而导致资源浪费或内存泄露.为解决这个问题,垃圾回收器诞生了,代替程序员自动管理内存的释放.至于gc算法则是垃圾回收器清 ...
- ubuntu 16.04 下更换boost版本
如果是新机器,没装过boost,那么直接一条命令 sudo apt-get install libboost-all-dev 头文件一般安装在 /usr/include 下面有一个目录boost,里面 ...
- Java线程池种类、区别和适用场景
newCachedThreadPool: 底层:返回ThreadPoolExecutor实例,corePoolSize为0:maximumPoolSize为Integer.MAX_VALUE:keep ...