慕课网----大话PHP设计模式 六(面向对象编程的基本原则,自动加载config)

一。面向对象编程的基本原则
1.单一职责:一个类,只需要做好一件事情。不要使用一个类来完成一个很复杂的功能。而是拆分成更小更具体的类。
2.开放封闭:一个类,应该是可扩展的,而不可修改的。不应该使用修改来增加功能。而是通过扩展来增加功能。
3.依赖倒置:一个类,不应该强依赖另一个类,每个类对于另一个类都是不可替换的。
举个例子:
如果A需要依赖B类,不应该直接在A类中去直接调用B类,而是应该使用依赖注入的方式,通过注入将B类的对象注入给A类,这样B对于A来说就是可以替换的。
如果现在有另外一个类C。提供了跟B类一致的接口。那就可以在C和B之间进行切换。
4.配置化:尽可能的使用配置,而不是硬编码。数据参数,常量都是可以配置的。
5.面向对象接口编程:只需要关心接口,而不是关心实现。

21.在mvc中加载config的配置文件。
1)php中使用ArrayAccess实现配置文件的加载
ArrayAccess这个类是php标准类库提供的一个接口,这样就可以用数组的方式来访问配置的内容。
这个类的自动加载的方式针对配置文件,这就是yii的config文件使用数组的方式然后可以加载进来的方法了。
配置文件的定义方法就是,先定义一个数组,然后return这个数组就好了,如controller这个文件。

<?php
$config = array(
    'home' => array(
        'decorator' => array(
            //'App\Decorator\Login',
            //'App\Decorator\Template',
            //'App\Decorator\Json',
        ),
    ),
    'default' => 'hello world',
);
return $config;

在config方法中

//获取数组的key
//自动加载的话只要关注获取数组的key就好了
function offsetGet($key)
{
    if (empty($this->configs[$key]))//判断配置是否存在
    {
        //就要去文件系统中,加载这个文件,把对应的文件都加载进来,
        //比如去加载config目录下的controller的配置,就可以用这种方式去require进来
        //这就是yii的config文件使用数组的方式然后可以加载进来的方法了
        $file_path = $this->path.'/'.$key.'.php';
        $config = require $file_path;
        //获取到这个配置的数组后,然后添加到这个类的configs参数里面
        $this->configs[$key] = $config;
    }
    return $this->configs[$key];
}

然后再index这个入口文件中打印

//自动加载配置
$config = new Imooc\Config(__DIR__.'/configs');
var_dump($config['controller']);

结果如下

2)在工厂方法中读取配置,生成可配置的对象
实例,数据库对象生成的实例:
在工厂类中创造数据库连接的时候,读取配置
使用主从分离,主机只有一个,从机可以有多个
如果读的话就直接调用master这个数据库,如果写的话,就调用slave数据库,然后通过array_rand的方法来随机选取

static function getDatabase($id = 'proxy')
{
    if ($id == 'proxy')
    {
        if (!self::$proxy)
        {
            self::$proxy = new \IMooc\Database\Proxy;
        }
        return self::$proxy;
    }

    $key = 'database_'.$id;
    if ($id == 'slave')
    {
        $slaves = Application::getInstance()->config['database']['slave'];
        $db_conf = $slaves[array_rand($slaves)];
    }
    else
    {
        $db_conf = Application::getInstance()->config['database'][$id];
    }
    $db = Register::get($key);
    if (!$db) {
        $db = new Database\MySQLi();
        $db->connect($db_conf['host'], $db_conf['user'], $db_conf['password'], $db_conf['dbname']);
        Register::set($key, $db);
    }
    return $db;
}

配置文件如下

<?php
$config = array(
    //使用主从分离,主机只有一个,从机可以有多个
    //如果读的话就直接调用master这个数据库,如果写的话,就调用slave数据库,然后通过array_rand的方法来随机选取
    'master' => array(
        'type' => 'MySQL',
        'host' => '127.0.0.1',
        'user' => 'root',
        'password' => 'root',
        'dbname' => 'test',
    ),
    'slave' => array(
        'slave1' => array(
            'type' => 'MySQL',
            'host' => '127.0.0.1',
            'user' => 'root',
            'password' => 'root',
            'dbname' => 'test',
        ),
        'slave2' => array(
            'type' => 'MySQL',
            'host' => '127.0.0.1',
            'user' => 'root',
            'password' => 'root',
            'dbname' => 'test',
        ),
    ),
);
return $config;

3)使用装饰器模式实现权限验证,模板渲染,json串化
4)使用观察者模式实现数据更新时间的一系列更新操作
5)使用代理模式实现数据库的主从主动切换

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值