[PHP] 使用適配器模式處理數據庫對象

適配器模式的定義:php

將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得原來因爲接口不兼容而不能一塊兒工做的那此類能夠一塊兒工做mysql

 

包括兩種模式:sql

類適配器模式與對象適配器函數

類適配器:Adapter類與被適配類是繼承關係fetch

對象適配器:Adapter對象與被適配類對象是委託關係 , 委託關係就是經過構造函數或者方法傳入被適配對象this

 

PDOAdapter 繼承 PDO類 , 擴展裏面的方法 , 這就是類適配器模式spa

ArticleModel傳入PDOAdapter 對象 , 擴展PDOAdapter 對象的方法 , 這就是對象適配器code

<?php
//類適配器
class PDOAdapter extends PDO{
    private $dsn = null;
    private $username = null;
    private $password = null;
    private $timeout = 30;
    private $charset = "utf8";
    private $options = array(
        PDO::ATTR_AUTOCOMMIT            => true,
        PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC,
    );
    public function __construct($dsn, $username, $password, $timeout = null){
        $this->dsn = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->timeout = intval($timeout);
        parent::__construct($dsn, $username, $password, $this->options);
        $this->exec("set names ".$this->charset);
    }
    public function execute($sql, $params = array()){
        $stmt = $this->prepare($sql);
        $execStatus=$stmt->execute($params);
        return $execStatus;
    }
    public function getAll($sql, $params = array()){
        $stmt = $this->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }
}
//對象適配器,使用委派
class ArticleModel{
    private $pdo=null;
    public function __construct($pdo){
        $this->pdo=$pdo;
    }
    //委派調用PDOAdapter的getAll方法
    public function getArticleList(){
        $res=$this->pdo->getAll("select * from countries");
        return $res;
    }
}
class Controller{
  public function doAction(){
      try {
          $pdo=new PDOAdapter("mysql:host=127.0.0.1;port=3306;dbname=phpfly","phpfly","phpfly");
          $model=new ArticleModel($pdo);
          $res=$model->getArticleList();
          var_dump($res);

      } catch (Exception $e) {
          var_dump($e->getMessage());
      }

  }
}
$c=new Controller();
$c->doAction();
相關文章
相關標籤/搜索