最新消息:欢迎加入小松的QQ群一起讨论一起学习,搜索页面修改成lua+ElasticSearch,使用php这个页面速度相对慢一点,优化之后速度杠杠的,如有问题请加群联系我

php ArrayAccess自动加载配置的使用

PHP 84浏览 0评论

ArrayAccess是一个php自带的interface(接口),框架中都会用到,比如larvel框架
下面的代码就是使用ArrayAccess自动来加载配置文件

namespace Bootstrap;

class Config implements \ArrayAccess{
    protected $path;
    protected $configs = array();
    public function __construct($path){
        $this->path=$path;

    }
    //获取配置值
    function offsetGet($key){
        if (empty($this->configs[$key]))
        {
            $file_path = $this->path.'/'.$key.'.php';
            $config = require $file_path;            
            $this->configs[$key] = $config;
        }
        return $this->configs[$key];
    }
    //设置配置值
    function offsetSet($key, $value)
    {
        throw new \Exception("cannot write config file.");
    }
    //检查配置是否存在
    function offsetExists($key)
    {
        return isset($this->configs[$key]);
    }
    //删除配置
    function offsetUnset($key)
    {
        unset($this->configs[$key]);
    }

}

使用

$config=new Config($base_dir.'/config'); 
print_r($config['database']);

代码会自动调用offsetGet方法,如果没有$this->configs[‘database’],就include database.php 赋值在返回配置内容

unset($config['database']) //自动调用offsetUnset
$config['database'] = 'redis';//自动调用offsetSet
if(isset($config['database']))//自动调用offsetExists
}

database.php文件内容

$config = array(
    'mysql' => array(
        'type' => 'MySQL',
        'host' => '127.0.0.1',
        'user' => 'root',
        'password' => 'root',
        'dbname' => 'phpsong',
    )
);
//注意这里有个return
return $config;

larvel框架的容器就是使用了ArrayAccess

class Container implements ArrayAccess, ContainerContract
{
//...
}
class Application extends Container implements ApplicationContract, HttpKernelInterface
{
//...
    public function bootstrapWith(array $bootstrappers)
    {
        $this->hasBeenBootstrapped = true;

        foreach ($bootstrappers as $bootstrapper) {
            //这里就$this['events']就是一个ArrayAccess的的使用
            $this['events']->fire('bootstrapping: '.$bootstrapper, [$this]);

            $this->make($bootstrapper)->bootstrap($this);

            $this['events']->fire('bootstrapped: '.$bootstrapper, [$this]);
        }
    }
//...
}
QQ交流群:136351212

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» php ArrayAccess自动加载配置的使用
本文链接地址:https://www.phpsong.com/3022.html

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
木有头像就木有JJ!点这里按步骤申请Gravatar头像吧!