搜尋
首頁php教程php手册一步步编写PHP的Framework(十六)

 

我把模型分成了几块儿,A,B,C,D,E,F,这几块儿分别代表了什么呢?

      首先A,这个Base代表的就是整个框架的基类,所有的模型文件都必须继承自这个基类;

      由于B的内容需要依赖D,所以先说一下D,D首先有一个ConnectionManager,它负责管理数据库的连接和关闭还有数据库驱动的选择,这个命名自己感觉不太好,先就将就吧,既然它负责数据库的连接和关闭,肯定它就有以下方法:

1

2 public class ConnectionManager {

3    public static function getConnection(){}

4    public static function releaseConnection() {}

5 }

 

     由于数据库的连接对于所有模型来说都是共享的,所以我们把ConnnectionManager设置为单例。

     D中右边有PDO,MYSQL_*,这代表什么意思呢,实际上就是代表各种驱动,有可能你使用的是比较先进的PDO,也有可能你使用的是比较老的MYSQL_*这种,也有可能你使用的是mysqli,ADO等等,正是由于PHP数据库这一块儿的混乱情况,我们需要在框架中定义一个契约,所有的驱动类按照这个契约编写实现,这样,不管驱动类的底层实现怎样,但是上层看到的内容都是一致的。

     现在我们定义一下这个契约:

01

02 interface IDbDriver {

03     function execute($sql);

04     function connect();

05     function close();

06     function getAllByObject();

07     function getAllByAssocArray();

08     function getAllByArray();

09     function beginTrans();

10     function commit();

11     function rollback();

12 }

 

      connect就是连接数据库,execute就是执行一个SQL,如果这个SQL是一个查询,那么getAllByObject代表将查询的结果通过对象返回,getAllByAssocArray代表将结果按照关联数组返回,getAllByArray代表将结果按照普通数组返回,beginTrans代表开启一个事务,即开启autoCommit,commit就是提交事务,rollback是将事务回滚,close就是关闭Db。

      其实,在将查询的结果返回的时候,还可以封装成为一个iterator。

       好,我们现在再来看看B,首先看看ModelBase,它实际上是提供给表模型和关系模型使用的,它封装了外部可见的各种函数,如query,insert,update,delete,execute,fetchAll等等,那也就是说B中所有的驱动类外部都是不可以直接访问的,那么谁访问呢,就是ModelBase,但是它又不直接访问,而是通过ConnectionManager来访问。

       由于ConnectionManager会按照配置文件自动选择驱动,所以ModelBase也不知道到底它调用的是哪一个驱动类,但是由于驱动类都遵循契约,所以ModelBase不用管到底是那个驱动,就可调用契约上面的方法了。

01

02 class ModelBase extends Base {

03     protected $_db = null;

04     public function __construct() {

05         $this->_db = ConnectionManager::getConnection();

06     }

07     public function execute($sql) {

08         $this->_db->execute($sql);

09     }

10 }

 

       就比如上面这段代码,首先在实例化ModelBase的时候,就会调用ConnectionManager的getConnection获取数据库的连接,当然,由于ConnectionManager是单例的,所以即使同时实例化了10个ModelBase类,数据库的连接操作也只有一次。

       由于有了上面的契约,在这一层执行一个SQL非常简单,只要调用驱动类的execute方法即可,即$this->_db->execute($sql);

       说了ModelBase,再说一下SQL Parse,它主要的功能就是完成SQL的解析,什么时候需要SQL的解析呢,实现数据库的ORM的时候。

       这一层也是由ModelBase调用的,假设现在外部有一个查询操作,调用的方式是$this->where()->order()->select(),当然,每个函数的参数我都没写,这种函数链非常友好,SQL Parse就会去解析这几个函数的实际意义,然后返回给ModelBase,ModelBase拿到解析之后的SQL,然后执行$this->_db->execute($sql)即可,所以不管花样是那样,最终都还是调用了驱动类的execute方法执行一条SQL的。

       下面的C实际上就容易理解了,就是表模型和关系模型,由于一些操作在ModelBase中已经做完了,所以只要表模型和关系模型继承ModelBase即可。表模型由于处理的是单表的内容,所以它有额外的内容,比如在执行一个$this->select()的时候 ,我们没有指定查询的内容,系统应该能够识别它要查询的表是什么,可能最终解析的SQL就是:select * from XXX了,关系模型也是一样。

        说完了C,E也很容易理解,模型这一层实际上就是调用关系模型或者表模型的方法实现具体的业务即可。

        F中是处理和普通数据库以外的其他内容,比如Cache,由于这里只是讲一下思路,所以这块儿的内容暂时不写,如果有时间就后面再讲,如果没有,那就算了。



陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器