-
單例模式:避免重復(fù)多次實例化一個對象,造成資源浪費
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(){
}
//靜態(tài)方法中只能調(diào)用靜態(tài)屬性或者靜態(tài)方法,非靜態(tài)方法可以調(diào)用靜態(tài)屬性或者靜態(tài)方法
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類? 當(dāng)實例化的類不存在此文件中,都會調(diào)用spl_autoload_register方法,默認作用同__autoload方法相似? 都會對使用到的類進行加載
spl_autoload_register可對使用的類進行重復(fù)加載 __autoload不會
\\IMooc\\Loader::autoload 命名空間下的某個類方法,該方法用來加載當(dāng)前文件中不存在的類
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";
}
}
查看全部 -
當(dāng)開發(fā)中需要訪問數(shù)據(jù)庫或者接口的時候,將所有的類都通過工廠模式生成一下,避免修改業(yè)務(wù)邏輯代碼
查看全部 -
php三種設(shè)計模式
查看全部 -
## MVC
模型-視圖-控制器 ,一種C/S或者B/S軟件工程的組織方式。
? ? - 模型(Model):數(shù)據(jù)和存儲的封裝
? ? - 視圖(View):展現(xiàn)層的封裝,如Web系統(tǒng)中的模板文件
????- 控制器(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導(dǎo)入MySqli ????????????$db?=?new?MySqli(); ????????????$db->connect($db_config); ????????????Register::set($key,?$db); ????????} ????????return?$db; ????}
查看全部 -
#### 簡單實例
我們讓所有客戶端訂閱我們的服務(wù)端,那么當(dāng)我們的服務(wù)端有更新信息的時候,就通知客戶端去更新。這里的服務(wù)端就是被觀察者,客戶端就是觀察者。
查看全部 -
## 策略模式
#### 定義
將一組特定的行為和算法封裝成類,以適應(yīng)特定的上下文環(huán)境,這種模式就是策略模式
#### 實際應(yīng)用舉例
假如一個電商網(wǎng)站系統(tǒng),針對男性女性用戶要各自跳轉(zhuǎn)到不同的商品類目,并且所有廣告位展示不同的廣告。
假設(shè)需要增加一個推薦位,之后再要求增加一個vip策略
傳統(tǒng)模式:
```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();
```
#### 使用策略模式可以實現(xiàn)Ioc,依賴導(dǎo)致、控制反轉(zhuǎn)
在寫Page類的時候,并不需要去定義好所依賴的類,里面沒有它的代碼,最終在代碼執(zhí)行過程中,才將關(guān)系進行綁定,這種設(shè)計模式在我們面向?qū)ο蟮脑O(shè)計之中經(jīng)常要用到這個,因為面向?qū)ο蠛苤匾囊粋€思路就是**解耦**。
如果兩個類是互相依賴的關(guān)系,那么它們之間的關(guān)系就是**緊耦合**設(shè)計,使用策略模式進行一個依賴倒置之后,我們就可以很方便去替換其中一個類。
查看全部 -
# 單例模式
傳統(tǒng)模式:某個類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)?{}
后面#的數(shù)字表示不同對象?
單例模式:只創(chuàng)建一個對象,之后再需要使用的話使用同一個對象。(不允許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:一個項目依賴多個框架,會包函數(shù)重新聲明錯誤。
- spl_autoload_register:php5.3之后針對__autoload的缺陷出來的函數(shù)。
查看全部 -
## 工廠模式
傳統(tǒng)模式:每個類都需要去new一下,當(dāng)類名和參數(shù)改變時就需要每個地方進行修改。
工廠模式:當(dāng)類名和參數(shù)改變時只需要去工廠類里面改變。
查看全部 -
# 3種基本設(shè)計模式:
- 工廠模式:工廠方法或者類生成對象,而不是在代碼中直接new
- 單例模式:使某個類的對象允許創(chuàng)建一個
- 注冊模式:全局共享和交換對象
查看全部 -
github有:
https://github.com/adobe-fonts/source-code-pro
查看全部 -
策略模式
查看全部 -
通過ruturn $this來完成鏈?zhǔn)讲僮鳌?/p>
```php
$this->where()->order()->select();
```
查看全部 -
phpstorm下載地址
查看全部
舉報