国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

我設計一個phpms框架前的準備

Jokcy / 2832人閱讀

摘要:框架源碼一常用的四種數(shù)據(jù)結構簡介是的一個標準庫。五其他常見的種設計模式適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口適配器模式使得原本的由于接口不兼容而不能一起工作的那些類可以一起工作。場景一個事件發(fā)生后,要執(zhí)行一連串更新操作。

phpms框架源碼https://github.com/wuxiumu/ms
一、PHP常用的四種數(shù)據(jù)結構

簡介:spl是php的一個標準庫。

官方文檔:http://php.net/manual/zh/book...

push("data1");//入棧(先進后出)
    $stack->push("data2");//入棧
    $stack->push("data3");//入棧
     
    echo $stack->pop().PHP_EOL;//出棧
    echo $stack->pop().PHP_EOL;//出棧
    echo $stack->pop().PHP_EOL;//出棧
}
 
 /**
 *隊列(先進先出)
 */

function duilie(){
    $queue = new SplQueue();
    $queue->enqueue("data4");//入隊列
    $queue->enqueue("data5");//入隊列
    $queue->enqueue("data6");//入隊列
    
    echo $queue->dequeue().PHP_EOL;//出隊列
    echo $queue->dequeue().PHP_EOL;//出隊列
    echo $queue->dequeue().PHP_EOL;//出隊列
}
 
/**
 * 堆
 */
function dui(){
    $heap = new SplMinHeap();
    $heap->insert("data8");//入堆
    $heap->insert("data9");//入堆
    $heap->insert("data10");//入堆
    
    echo $heap->extract().PHP_EOL;//從堆中提取數(shù)據(jù)
    echo $heap->extract().PHP_EOL;//從堆中提取數(shù)據(jù)
    echo $heap->extract().PHP_EOL;//從堆中提取數(shù)據(jù)
}
  
/**
 * 固定數(shù)組(不論使不使用,都會分配相應的內(nèi)存空間)
 */
$array = new SplFixedArray(15);
$array["0"] = 54;
$array["6"] = 69;
$array["10"] = 32;
var_dump($array);
二、PHP鏈式操作的實現(xiàn)(原理) 1、入口文件

index.php

header("content-type:text/html;charset=utf-8"); 
define("PHPMSFRAME",__DIR__);                   
define("CORE",PHPMSFRAME."/core");
define("APP",PHPMSFRAME."/app");
define("MODULE","app");

define("DEBUG",true);
 
include "vendor/autoload.php";

if(DEBUG){
    $whoops = new WhoopsRun;
    $whoops->pushHandler(new WhoopsHandlerPrettyPageHandler);
    $whoops->register();
    ini_set("display_error", "On");
}else{
    ini_set("display_error", "Off");
}

include CORE."/common/function.php";

include CORE."/phpmsframe.php";

spl_autoload_register("corephpmsframe::load");

corephpmsframe::run();
2、自動加載類

corephpmsframe.php

ctrl;
        $action = $route->action;        
        $ctrlfile = APP."/ctrl/".$ctrlClass."Ctrl.php";
        $ctrlClass = "".MODULE."ctrl".$ctrlClass."Ctrl";
        if(is_file($ctrlfile)){            
            include $ctrlfile;            
            $ctrl = new $ctrlClass();
            $ctrl->$action();                    
        }else{    
            $msg = "控制器 $ctrlClass 不存在
";         
            self::reportingDog($msg);            
        }
    }

    static public function load($class)
    {
        if(isset($classMap[$class])){
            return true;
        }else{
            $class  = str_replace("", "/", $class);
            $file = PHPMSFRAME."/".$class.".php";
            if(is_file($file)){
                include $file;
                self::$classMap[$class] = $class; 
            }else{
                return false;
            }
        }
    }

    public function assign($name,$value){
        $this->assign[$name]=$value;
    }

    public function display($file){
        $file_path = APP."/views/".$file;
        if(is_file($file_path)){    
            /***********twig模板***********/
            $loader = new Twig_Loader_Filesystem(APP."/views");
            $twig = new Twig_Environment($loader, array(
                "cache" => PHPMSFRAME."/cache",
                "debug"=>DEBUG,
            ));                        
            $template = $twig->load($file);            
            $template->display($this->assign?$this->assign:"");
            /***********twig模板end***********/

            /***********原生模板***********/
            //extract($this->assign);
            //include $file_path;
            /***********原生模板end***********/
        }
    }

    static private function reportingDog($msg){
        echo $msg."
";        
        include "smile/havefun.php";        
        $num = str_pad(rand(00,32),2,"0",STR_PAD_LEFT);
        $num = "str_".$num;        
        $Parsedown = new Parsedown();
        echo $Parsedown->text($$num);
        $num = "str_".rand(50,84);
        echo $Parsedown->text($$num); 
        exit;
    }
}
3、數(shù)據(jù)庫類

注:只是原理,并沒有對方法進行具體的封裝,具體的封裝還是看個人喜好去定鏈式查詢的風格。

corelibmodel.php


corelibdrivedatabasemedooModel.php


三、PHP魔術方法的使用

在php設計模式中,會涉及到很多魔術方法的使用,這里也對經(jīng)常會用到的魔術方法進行簡單總結。

1、框架入口文件

corephpmsframe.php

   /**
    * 魔術方法的使用
    */
 
   /* 這是一個魔術方法,當一個對象或者類獲取其不存在的屬性的值時,
    * 如:$obj = new BaseController ;
    * $a = $obj -> a ;
    * 該方法會被自動調(diào)用,這樣做很友好,可以避免系統(tǒng)報錯
    */
    public function __get($property_name){
        $msg = "屬性 $property_name 不存在
";
        self::reportingDog($msg);    
    }

   /* 這是一個魔術方法,當一個對象或者類給其不存在的屬性賦值時,
    * 如:$obj = new BaseController ;
    * $obj -> a = 12 ;
    * 該方法(__set(屬性名,屬性值))會被自動調(diào)用,這樣做很友好,可以避免系統(tǒng)報錯
    */
    public function __set($property_name,$value){
        $msg = "屬性 $property_name 不存在
";
        self::reportingDog($msg);    
    }

   /* 這是一個魔術方法,當一個對象或者類的不存在屬性進行isset()時,
    * 注意:isset 用于檢查一個量是否被賦值 如果為NULL會返回false
    * 如:$obj = new BaseController ;
    * isset($obj -> a) ;
    * 該方法會被自動調(diào)用,這樣做很友好,可以避免系統(tǒng)報錯
    */
    public function __isset($property_name){
        $msg = "屬性 $property_name 不存在
";
        self::reportingDog($msg);    
    }

   /* 這是一個魔術方法,當一個對象或者類的不存在屬性進行unset()時,
    * 注意:unset 用于釋放一個變量所分配的內(nèi)存空間
    * 如:$obj = new BaseController ;
    * unset($obj -> a) ;
    * 該方法會被自動調(diào)用,這樣做很友好,可以避免系統(tǒng)報錯
    */
    public function __unset($property_name){
        $msg = "屬性 $property_name 不存在
";
        self::reportingDog($msg);    
    }

    /* 當對這個類的對象的不存在的實例方法進行“調(diào)用”時,會自動調(diào)用該方法,
     * 這個方法有2個參數(shù)(必須帶有的):
     * $methodName 表示要調(diào)用的不存在的方法名;
     * $argument 是一個數(shù)組,表示要調(diào)用該不存在的方法時,所使用的實參數(shù)據(jù),
     */
    public function __call($methodName,$argument){
        $msg = "實例方法 $methodName 不存在
";
        self::reportingDog($msg);    
    }
四、三種基礎設計模式 1、工廠模式

通過傳入?yún)?shù)的不同,來實例化不同的類。

$cache =CoreextendCacheFactory::getCacheObj("redis",array(
            "host" => "127.0.0.1",
            "pass" => "myRedis&&&"
        ));
var_dump($cache);

coreextendCacheFactory.php


2、單例模式

保證一個類只實例化一個類對象,進而減少系統(tǒng)開銷和資源的浪費

//單例模式創(chuàng)建對象
$obj = ExtendSingleObject::getInstance();
$obj2 = ExtendSingleObject::getInstance();
var_dump($obj,$obj2);//從結果可以看出,兩個實例化的對象其實是一個對象

coreextendSingleObject.php


3、注冊樹模式

將我們用到的對象注冊到注冊樹上,然后在之后要用到這個對象的時候,直接從注冊樹上取下來就好。(就和我們用全局變量一樣方便)

coreextendRegisterTree,php


關于注冊樹模式,這里推薦一篇文章 ,可以方便理解。 https://segmentfault.com/a/11...

五、其他常見的8種PHP設計模式 1、適配器模式

將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使得原本的由于接口不兼容而不能一起工作的那些類可以一起工作。
應用場景:老代碼接口不適應新的接口需求,或者代碼很多很亂不便于繼續(xù)修改,或者使用第三方類庫。

常見的有兩種適配器,分別是類適配器和對象適配器,這里拿更看好的對象適配器舉例:

";
    }
 
}
 
/**
 * 類適配器角色(新定義接口的具體實現(xiàn))
 * Class Adapter
 * @package Extend
 */
class Adapter implements Target
{
 
    private $adaptee;
 
    function __construct()
    {
        //適配器初始化直接new 原功能類,以方便之后委派
        $adaptee = new Adaptee();
        $this->adaptee = $adaptee;
    }
 
    //委派調(diào)用Adaptee的sampleMethod1方法
    public function simpleMethod1()
    {
        echo $this->adaptee->simpleMethod1();
    }
 
    public function simpleMethod2()
    {
        echo "Adapter simpleMethod2"."
"; } } /** * 客戶端調(diào)用 */ $adapter = new Adapter(); $adapter->simpleMethod1(); $adapter->simpleMethod2();

這篇文章介紹了類適配器的使用,感興趣的可以了解一下 https://segmentfault.com/a/11...

2、策略模式

將一組特定的行為和算法封裝成類,以適應某些特定的上下文環(huán)境,這種模式就是策略模式,策略模式可以實現(xiàn)依賴倒置以及控制反轉(zhuǎn)。

實例舉例:假如一個電商網(wǎng)站系統(tǒng),針對男性女性用戶要各自跳轉(zhuǎn)到不同的商品類目,并且所有的廣告位展示展示不同的廣告。

userType->showAd();
        echo "Category:";
        $this->userType->showCategory();
    }
 
    /**
     * 策略模式
     * 根據(jù)傳遞的用戶性別展示不同類別數(shù)據(jù)
     * @param ExtendUserType $userType
     */
    function setUserType(ExtendUserType $userType)
    {
        $this->userType = $userType;
    }
 
}
 
$obj = new Home();
if ($_GET["userType"] == "female"){
    $userType = new ExtendFemaleUserType();
} else {
    $userType = new ExtendMaleUserType();
}
$obj->setUserType($userType);
$obj->index();

Extend/userType.php(定義的接口)


MaleUserType.php、FemaleUserType.php(具體實現(xiàn)的類 )



3、數(shù)據(jù)對象映射模式

將對象和數(shù)據(jù)存儲映射起來,對一個對象的操作會映射為對數(shù)據(jù)存儲的操作。

下面在代碼中實現(xiàn)數(shù)據(jù)對象映射模式,我們將實現(xiàn)一個ORM類,將復雜的sql語句映射成對象屬性的操作。并結合使用數(shù)據(jù)對象映射模式、工廠模式、注冊模式。

?

(1)數(shù)據(jù)庫映射模式簡單實例實現(xiàn)

name = "小卜丟飯團子";
$user->salary = "20000";
$user->city = "浙江省";
 

Extend/User.php

id = $id;
        $this->pdo = new PDO("mysql:host=127.0.0.1;dbname=test","root","123456");
    }
 
    function __destruct()
    {
        $this->pdo->query("update user set name = "{$this->name}",salary = "{$this->salary}",city = "{$this->city}" where id="{$this->id}"");
    }
}

這樣,執(zhí)行index.php文件,數(shù)據(jù)庫就會發(fā)生相應的操作,也就實現(xiàn)了基本的數(shù)據(jù)對象映射。

(2)數(shù)據(jù)庫映射模式復雜案例實現(xiàn)

name = "小卜丟飯團子";
        $user->salary = "20000";
        $user->city = "浙江省";
    }
 
    function test()
    {
        $user = ExtendFactory::getUserObj(25);
        $user->city = "廣東省";
    }
 
}
 
$ex = new EX();
$ex->index();

Extend/Factory.php


Extend/Register.php


Extend/User.php

id = $id;
        $this->pdo = new PDO("mysql:host=127.0.0.1;dbname=test","root","123456");
    }
 
    function __destruct()
    {
        $this->pdo->query("update user set name = "{$this->name}",salary = "{$this->salary}",city = "{$this->city}" where id="{$this->id}"");
    }
}

這樣,就實現(xiàn)了稍復雜的數(shù)據(jù)對象映射模式和工廠模式、注冊樹模式相結合的案例。

?

4、觀察者模式

當一個對象狀態(tài)發(fā)生改變時,依賴它的對象會全部收到通知,并自動更新。

場景:一個事件發(fā)生后,要執(zhí)行一連串更新操作。傳統(tǒng)的編程方式就是在事件的代碼之后直接加入處理邏輯,當更新的邏輯增多之后,代碼會變的難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件主體的代碼。觀察者模式實現(xiàn)了低耦合,非侵入式的通知與更新機制。

?

4.1、傳統(tǒng)模式舉例:
";
        //傳統(tǒng)方式是在發(fā)生一個事件之后直接進行一系列的相關處理,耦合度比較高,比如寫入日志,給用戶發(fā)郵件等等
        echo "在用戶下單之后進行的一系列操作
"; } } $event = new Event(); $event->firmOrder();
4.2、觀察者模式典型實現(xiàn)方式:

(1)定義2個接口:觀察者(通知)接口、被觀察者(主題)接口

(2)定義2個類,觀察者類實現(xiàn)觀察者接口、被觀察者類實現(xiàn)被觀察者接口

(3)被觀察者注冊自己需要通知的觀察者

(4)被觀察者類某個業(yè)務邏輯發(fā)生時,通知觀察者對象,進而每個觀察者執(zhí)行自己的業(yè)務邏輯。

代碼示例:

observers[] = $observer;
    }
 
 
    /**
     * 購票主體方法
     * BuyTicket constructor.
     * @param $ticket 購票排號
     */
    public function buyTicket($ticket)
    {
        //1、根據(jù)需求寫購票邏輯
        //..............
 
        //2、購票成功之后,循環(huán)通知觀察者,并調(diào)用其buyTicketOver實現(xiàn)不同業(yè)務邏輯
        foreach ($this->observers as $observe) {
            $observe->buyTicketOver($this, $ticket); //$this 可用來獲取主題類句柄,在通知中使用
        }
 
    }
 
}
 
 
 
/**
 * 購票成功后,發(fā)送短信通知
 * Class buyTicketMSN
 */
class buyTicketMSN implements TicketObserver
{
    public function buyTicketOver($sender, $ticket)
    {
        echo (date ( "Y-m-d H:i:s" ) . " 短信日志記錄:購票成功:$ticket
"); } } /** * 購票成功后,記錄日志 * Class buyTicketLog */ class buyTicketLog implements TicketObserver { public function buyTicketOver($sender, $ticket) { echo (date ( "Y-m-d H:i:s" ) . " 文本日志記錄:購票成功:$ticket
"); } } /** * 購票成功后,贈送優(yōu)惠券 * Class buyTicketCoupon */ class buyTicketCoupon implements TicketObserver { public function buyTicketOver($sender, $ticket) { echo (date ( "Y-m-d H:i:s" ) . " 贈送優(yōu)惠券:購票成功:$ticket 贈送10元優(yōu)惠券1張。
"); } } //實例化購票類 $buy = new BuyTicket(); //添加多個觀察者 $buy->addObserver(new buyTicketMSN()); $buy->addObserver(new buyTicketLog()); $buy->addObserver(new buyTicketCoupon()); //開始購票 $buy->buyTicket ("7排8號");
5、原型模式

原型模式與工廠模式的作用類似,都是用來創(chuàng)建對象的。但是實現(xiàn)方式是不同的。原型模式是先創(chuàng)建好一個原型對象,然后通過clone原型對象來創(chuàng)建新的對象。這樣,就免去了類創(chuàng)建時重復的初始化操作。

原型模式適用于大對象的創(chuàng)建,創(chuàng)建一個大對象需要很大的開銷,如果每次new就會消耗很大,原型模式僅需內(nèi)存拷貝即可。

代碼實例:

_name = $name;
    }
 
    public function setName($name)
    {
        $this->_name = $name;
    }
 
    public function getName()
    {
        return $this->_name;
    }
 
    public function copy()
    {
        //深拷貝實現(xiàn)
         //$serialize_obj = serialize($this); // 序列化
         //$clone_obj = unserialize($serialize_obj); // 反序列化
         //return $clone_obj;
 
        // 淺拷貝實現(xiàn)
        return clone $this;
    }
 
}
 
/**
 * 測試深拷貝用的引用類
 */
class Demo
{
    public $array;
}
 
 
//測試
$demo = new Demo();
$demo->array = array(1, 2);
$object1 = new ConcretePrototype($demo);
$object2 = $object1->copy();
 
var_dump($object1->getName());
echo "
"; var_dump($object2->getName()); echo "
"; $demo->array = array(3, 4); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
";

關于原型模式文章:https://www.imooc.com/article...

6、裝飾器模式

可以動態(tài)的添加或修改類的功能

一個類實現(xiàn)一個功能,如果要再修改或添加額外的功能,傳統(tǒng)的編程模式需要寫一個子類繼承它,并重新實現(xiàn)類的方法。

使用裝飾器模式,僅需在運行時添加一個裝飾器對象即可實現(xiàn),可以實現(xiàn)最大的靈活性。

color = $color;
    }
 
    public function beforeEcho()
    {
        echo "";
    }
 
    public function afterEcho()
    {
        echo "
"; } } /** * 字體大小裝飾器實現(xiàn) * Class SizeDecorator */ class SizeDecorator implements Decorator { protected $size; public function __construct($size) { $this->size = $size; } public function beforeEcho() { echo ""; } public function afterEcho() { echo "
"; } } /** * 被裝飾者 * 輸出一個字符串 * 裝飾器動態(tài)添加功能 * Class EchoText */ class EchoText { protected $decorators = array();//存放裝飾器 //裝飾方法 public function Index() { //調(diào)用裝飾器前置操作 $this->beforeEcho(); echo "你好,我是裝飾器。"; //調(diào)用裝飾器后置操作 $this->afterEcho(); } //添加裝飾器 public function addDecorator(Decorator $decorator) { $this->decorators[] = $decorator; } //執(zhí)行裝飾器前置操作 先進先出原則 protected function beforeEcho() { foreach ($this->decorators as $decorator) $decorator->beforeEcho(); } //執(zhí)行裝飾器后置操作 先進后出原則 protected function afterEcho() { $tmp = array_reverse($this->decorators); foreach ($tmp as $decorator) $decorator->afterEcho(); } } //實例化輸出類 $echo = new EchoText(); //增加裝飾器 $echo->addDecorator(new ColorDecorator("yellow")); //增加裝飾器 $echo->addDecorator(new SizeDecorator("22")); //輸出 $echo->Index(); 7、迭代器模式

在不需要了解內(nèi)部實現(xiàn)的前提下,遍歷一個聚合對象的內(nèi)部元素而又不暴露該對象的內(nèi)部表示,這就是PHP迭代器模式的定義。

相對于傳統(tǒng)編程模式,迭代器模式可以隱藏遍歷元素的所需的操作。


Extend/AllUser.php

pdo = new PDO("mysql:host=127.0.0.1;dbname=test","root","123456");
        //獲取所有用戶的id
        $this->ids = $this->pdo->query("select id from user")->fetchAll(2);
    }
 
    /**
     * 實現(xiàn)接口方法,重置迭代器,回到集合開頭
     */
    public function rewind()
    {
        $this->index = 0;
    }
 
    /**
     * 實現(xiàn)接口方法,獲取當前元素
     * @return mixed|void
     */
    public function current()
    {
        $id = $this->ids[$this->index]["id"];
        //獲取當前用戶的數(shù)據(jù)
        $user_data = $this->pdo->query("select * from user where id="{$id}"")->fetch(2);
        return $user_data;
    }
 
    /**
     * 實現(xiàn)接口方法,獲取當前元素鍵值
     * @return mixed|void
     */
    public function key()
    {
        return $this->index;
    }
 
    /**
     * 實現(xiàn)接口方法,獲取下一個元素
     */
    public function next()
    {
        $this->index++;
    }
 
    /**
     * 實現(xiàn)接口方法,驗證是否還有下一個元素
     * @return bool|void
     */
    public function valid()
    {
        return $this->index < count($this->ids);
    }
 
}

關于php迭代器文章?http://www.php.cn/php-weiziji...

?

8、代理模式

在客戶端與實體之間建立一個代理對象(proxy),客戶端對實體進行操作全部委派給代理對象,隱藏實體的具體實現(xiàn)細節(jié)。

典型的應用就是mysql的主從結構,讀寫分離。在mysql中,對所有讀的操作請求從庫,所有寫的操作請求主庫。

聲明一個代理類,前臺使用時只需創(chuàng)建一個代理類,調(diào)用對應方法即可。代碼實例:

query("select * from user where id = 1 limit 1");
#增刪改操作使用主庫
//$db_master = ExtendFactory::getDatabase("master");
//$db_master->query("update user name = "xiaobudiu" where id = 29 limit 1");
 
 
// 2、使用代理模式
$db_proxy = new ExtendProxy();
$db_proxy->getUserName(1);
$db_proxy->setUserName(29,"xiaobudiu");

Extend/Proxy.php

query("select name from user where id =$id limit 1");
    }
 
    function setUserName($id, $name)
    {
        $db = Factory::getDatabase("master");
        $db->query("update user set name = $name where id =$id limit 1");
    }
}

Extend/Factory.php

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 DatabaseMySQLi();
            $db->connect($db_conf["host"], $db_conf["user"], $db_conf["password"], $db_conf["dbname"]);
            Register::set($key, $db);
        }
        return $db;
    }
 
}

Extend/Application.php

base_dir = $base_dir;
        $this->config = new Config($base_dir."/configs");
    }
 
    static function getInstance($base_dir = "")
    {
        if (empty(self::$instance))
        {
            self::$instance = new self($base_dir);
        }
        return self::$instance;
    }
    
}

Extend/Config.php

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]);
    }
}

configs/database.php

 array(
        "type" => "MySQL",
        "host" => "127.0.0.1",
        "user" => "root",
        "password" => "123456",
        "dbname" => "test",
    ),
    "slave" => array(
        "slave1" => array(
            "type" => "MySQL",
            "host" => "127.0.0.1",
            "user" => "root",
            "password" => "123456",
            "dbname" => "test",
        ),
        "slave2" => array(
            "type" => "MySQL",
            "host" => "127.0.0.1",
            "user" => "root",
            "password" => "123456",
            "dbname" => "test",
        ),
    ),
);
return $config;

關于php代理模式文章 https://segmentfault.com/a/11...

五、其余設計模式以及總結

文章接:

https://segmentfault.com/a/11...

https://segmentfault.com/a/11...

?

六、面向?qū)ο缶幊痰幕驹瓌t

1、單一職責原則:一個類只需要做好一件事情。不要使用一個類完成很多功能,而應該拆分成更多更小的類。

2、開放封閉原則:一個類寫好之后,應該是可擴展而不可修改的。

3、依賴倒置原則:一個類不應該強依賴另外一個類,每個類對于另外一個類都是可替換的。

4、配置化原則:盡量使用配置,而不是硬編碼。

5、面向接口編程原則:只需要關心某個類提供了哪些接口,而不需要關心他的實現(xiàn)。

?

七、自動加載配置類文件

1、php中使用ArrayAccess實現(xiàn)配置文件的加載(使得程序可以以數(shù)組的方式進行讀取配置)

(1)定義Config.php,繼承php自帶的ArrayAccess接口,并實現(xiàn)相應的方法,用于讀取和設置配置

Extend/Config.php

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]);
    }
}

(2)configs/database.php

 array(
        "type" => "MySQL",
        "host" => "127.0.0.1",
        "user" => "root",
        "password" => "123456",
        "dbname" => "test",
    ),
    "slave" => array(
        "slave1" => array(
            "type" => "MySQL",
            "host" => "127.0.0.1",
            "user" => "root",
            "password" => "123456",
            "dbname" => "test",
        ),
        "slave2" => array(
            "type" => "MySQL",
            "host" => "127.0.0.1",
            "user" => "root",
            "password" => "123456",
            "dbname" => "test",
        ),
    ),
);
return $config;

(3)讀取配置


到此,就可以在程序中隨心所欲的加載配置文件了。

2、在工廠方法中讀取配置,生成可配置化的對象

Extend/Factory.php

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 DatabaseMySQLi();
            $db->connect($db_conf["host"], $db_conf["user"], $db_conf["password"], $db_conf["dbname"]);
            Register::set($key, $db);
        }
        return $db;
    }
 
}

Extend/Application.php

base_dir = $base_dir;
        $this->config = new Config($base_dir."/configs");
    }
 
    static function getInstance($base_dir = "")
    {
        if (empty(self::$instance))
        {
            self::$instance = new self($base_dir);
        }
        return self::$instance;
    }
 
}

Extend/Config.php

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]);
    }
}

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29977.html

相關文章

  • 真香!在Github一夜爆火的面試題庫,程序員的福利!

    摘要:下面來看主要內(nèi)容爆款面試寶典目錄總覽面試前的準備工作面試就是雙方互相試探的過程,拋去技術面不談,面試前簡歷自我介紹,以及跟對線細節(jié)一定要提前準備好基礎技術基礎集合多線程框架橫向技術數(shù)據(jù)庫消息中間件網(wǎng)絡設計模式 ???? ? ?為了幫大家解決這一問題,LZ今天就把今年金三銀四幫我斬獲了8家大廠...

    Lowky 評論0 收藏0
  • Kubernetes 中如何保證優(yōu)雅地停止 Pod

    摘要:假如我們先告訴網(wǎng)關或服務注冊中心我們要下線,等對方完成服務摘除操作再中止進程,那不會有任何流量受到影響這是優(yōu)雅停止,將單個組件的啟停對整個系統(tǒng)影響最小化。與此同時,會將從對應的上摘除。 作者:吳葉磊 一直以來我對優(yōu)雅地停止 Pod 這件事理解得很單純:不就利用是?PreStop hook?做優(yōu)雅退出嗎?但最近發(fā)現(xiàn)很多場景下 PreStop Hook 并不能很好地完成需求,這篇文章就簡單...

    liaosilzu2007 評論0 收藏0
  • Kubernetes 中如何保證優(yōu)雅地停止 Pod

    摘要:假如我們先告訴網(wǎng)關或服務注冊中心我們要下線,等對方完成服務摘除操作再中止進程,那不會有任何流量受到影響這是優(yōu)雅停止,將單個組件的啟停對整個系統(tǒng)影響最小化。與此同時,會將從對應的上摘除。 作者:吳葉磊 一直以來我對優(yōu)雅地停止 Pod 這件事理解得很單純:不就利用是?PreStop hook?做優(yōu)雅退出嗎?但最近發(fā)現(xiàn)很多場景下 PreStop Hook 并不能很好地完成需求,這篇文章就簡單...

    Berwin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<