php array 转 access,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对象只需要实现ArrayAccess接口即可

实例运用

场景:假如我有一个User类,映射的是用户的信息,想通过数组的方式来访问和设置用户信息

/**

* 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我们会更轻松的实现。

下面我带你们一起看看我是这么实现的

1. 在项目更目录下创建一个config目录

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

app.php

return [

'name' => 'app name',

'version' => 'v1.0.0'

];

database.php

return [

'mysql' => [

'host' => 'localhost',

'user' => 'root',

'password' => '12345678'

]

];

3. Config.php实现ArrayAccess

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一起讨论

声明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值