一。面向对象编程的基本原则
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)使用代理模式实现数据库的主从主动切换