-
单例模式:避免重复多次实例化一个对象,造成资源浪费
Factory.php
<?php
namespace IMooc;
class Factory{
static function DataBase(){
$db = Database::getInstance();
return $db;
}
}
Database.php
<?php
namespace IMooc;
class Database{
private static $db;
//禁止通过外部实例化该类
private function __construct(){
}
//禁止通过外部客户该类
private function __clone(){
}
//静态方法中只能调用静态属性或者静态方法,非静态方法可以调用静态属性或者静态方法
static function getInstance(){
//instanceof 判断一个对象是否是某个类的实例 或是某个类的子类
if(self::$db instanceof self){
return self::$db;
}else{
self::$db = new self();
return self::$db;
}
}
}
index.php
<?php
define("BASEDIR",__DIR__);
require BASEDIR."/IMooc/Loader.php";
// 使用命名空间加载Loader类 当实例化的类不存在此文件中,都会调用spl_autoload_register方法,默认作用同__autoload方法相似 都会对使用到的类进行加载
spl_autoload_register可对使用的类进行重复加载 __autoload不会
\\IMooc\\Loader::autoload 命名空间下的某个类方法,该方法用来加载当前文件中不存在的类
spl_autoload_register("\\IMooc\\Loader::autoload");
$dbObject = IMooc\Factory::DataBase();
var_dump($dbObject);
Loader.php
<?php
namespace IMooc;
class Loader{
static function autoload($class){
require BASEDIR."/".str_replace("\\","/",$class).".php";
}
}
查看全部 -
当开发中需要访问数据库或者接口的时候,将所有的类都通过工厂模式生成一下,避免修改业务逻辑代码
查看全部 -
php三种设计模式
查看全部 -
## MVC
模型-视图-控制器 ,一种C/S或者B/S软件工程的组织方式。
- 模型(Model):数据和存储的封装
- 视图(View):展现层的封装,如Web系统中的模板文件
- 控制器(Controller):逻辑层的封装
查看全部 -
public static function getDatabase( $id = 'master' ) { $key = 'database_'.$id; if( $id == 'master' ){ $db_config = Application::getInstance()->config['database']['master']; } else { $db_configs = Application::getInstance()->config['database']['slave']; $db_config = $db_configs[array_rand($db_configs)]; } $db = Register::get($key); if( !$db ){ //使用use导入MySqli $db = new MySqli(); $db->connect($db_config); Register::set($key, $db); } return $db; }
查看全部 -
#### 简单实例
我们让所有客户端订阅我们的服务端,那么当我们的服务端有更新信息的时候,就通知客户端去更新。这里的服务端就是被观察者,客户端就是观察者。
查看全部 -
## 策略模式
#### 定义
将一组特定的行为和算法封装成类,以适应特定的上下文环境,这种模式就是策略模式
#### 实际应用举例
假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。
假设需要增加一个推荐位,之后再要求增加一个vip策略
传统模式:
```php
class Page{
public $strategy; //策略类型
public function index()
{
$femaleClass = new Core\FemaleUserStrategy();
$maleClass = new Core\maleUserStrategy();
$vipClass = new Core\vipUserStrategy();
echo 'AD'.'<br/>';
$sex = isset($_GET['sex']) ? trim($_GET['sex']) : '';
if( $sex =='female' ){
$femaleClass->showAD();
} else if( $sex == 'vip' ){
$vipClass->showAD();
} else {
$maleClass->showAD();
}
echo '<br/>';
echo 'Cateogry'.'<br/>';
if( $sex =='female' ){
$femaleClass->showCategory();
} else if( $sex == 'vip' ){
$vipClass->showCategory();
} else {
$maleClass->showCategory();
}
echo 'posid'.'<br/>';
if( $sex =='female' ){
$femaleClass->showPosid();
} else if( $sex == 'vip' ){
$vipClass->showPosid();
} else {
$maleClass->showPosid();
}
}
}
$data = new Page();
$sex = isset($_GET['sex']) ? trim($_GET['sex']) : '';
$data->index();
```
如果使用策略模式的话
```php
class Page{
public $strategy; //策略类型
public function index()
{
echo 'AD'.'<br/>';
$this->strategy->showAD();
echo '<br/>';
echo 'Cateogry'.'<br/>';
$this->strategy->showCategory();
echo '<br/>';
echo 'posid'.'<br/>';
$this->strategy->showPosid();
}
public function setStrategy($strategy)
{
$this->strategy = $strategy;
}
}
$data = new Page();
$sex = isset($_GET['sex']) ? trim($_GET['sex']) : '';
if( $sex =='female' ){
$strategy = new Core\FemaleUserStrategy();
} elseif( $sex == 'vip' ){
$strategy = new Core\vipUserStrategy();
} else {
$strategy = new Core\MaleUserStrategy();
}
$data->setStrategy($strategy);
$data->index();
```
#### 使用策略模式可以实现Ioc,依赖导致、控制反转
在写Page类的时候,并不需要去定义好所依赖的类,里面没有它的代码,最终在代码执行过程中,才将关系进行绑定,这种设计模式在我们面向对象的设计之中经常要用到这个,因为面向对象很重要的一个思路就是**解耦**。
如果两个类是互相依赖的关系,那么它们之间的关系就是**紧耦合**设计,使用策略模式进行一个依赖倒置之后,我们就可以很方便去替换其中一个类。
查看全部 -
# 单例模式
传统模式:某个类new之后都是一个新的对象。
如Database new 3遍之后:
$db1 = new \Core\Database(); $db2 = new \Core\Database(); $db3 = new \Core\Database(); var_dump($db1); var_dump($db2); var_dump($db3);
output:
object(Core\Database)#1 (0) {} object(Core\Database)#2 (0) {} object(Core\Database)#3 (0) {}
后面#的数字表示不同对象?
单例模式:只创建一个对象,之后再需要使用的话使用同一个对象。(不允许new,然后使用一个新的方法来使用前一个对象)
$db1 = \Core\Database::getInstance(); $db2 = \Core\Database::getInstance(); $db3 = \Core\Database::getInstance(); var_dump($db1); var_dump($db2); var_dump($db3);
output:
object(Core\Database)#1 (0) {} object(Core\Database)#1 (0) {} object(Core\Database)#1 (0) {}
查看全部 -
# 类自动加载
- __autoload:一个项目依赖多个框架,会包函数重新声明错误。
- spl_autoload_register:php5.3之后针对__autoload的缺陷出来的函数。
查看全部 -
## 工厂模式
传统模式:每个类都需要去new一下,当类名和参数改变时就需要每个地方进行修改。
工厂模式:当类名和参数改变时只需要去工厂类里面改变。
查看全部 -
# 3种基本设计模式:
- 工厂模式:工厂方法或者类生成对象,而不是在代码中直接new
- 单例模式:使某个类的对象允许创建一个
- 注册模式:全局共享和交换对象
查看全部 -
github有:
https://github.com/adobe-fonts/source-code-pro
查看全部 -
策略模式
查看全部 -
通过ruturn $this来完成链式操作。
```php
$this->where()->order()->select();
```
查看全部 -
phpstorm下载地址
查看全部
举报