ホームページ  >  記事  >  php教程  >  PHP フレームワークをステップバイステップで作成する (16)

PHP フレームワークをステップバイステップで作成する (16)

WBOY
WBOYオリジナル
2016-06-21 08:50:391299ブラウズ

モデルをいくつかの部分 A、B、C、D、E、F に分割しました。これらの部分は何を表しているのでしょうか?

まず、A、この Base はフレームワーク全体の基本クラスを表し、すべてのモデル ファイルはこの基本クラスから継承する必要があります。

B の内容は D に依存する必要があるため、まず D について説明します。D には、データベースの接続と終了、およびデータベース ドライバーの選択を管理する ConnectionManager があります。この名前はよくありません。まず、これで何とかしてください。データベースの接続と終了を担当するため、次のメソッドが必要です:

1

1

2 public class ConnectionManager {

3 public static function getConnection(){}
<テーブル>

2

4 public static function releaseConnection() {}

5 }
パブリック クラス ConnectionManager {

<テーブル>

3 パブリック静的関数 getConnection(){}

<テーブル> 4

パブリック静的関数 releaseConnection() {}

<テーブル>

5

01

02 interface IDbDriver {
}

03 function execute($sql);
<🎜> <🎜> <🎜> <🎜> <🎜> <🎜><🎜> データベース接続はすべてのモデルで共有されるため、ConnectionManager をシングルトンとして設定します。 <🎜><🎜><🎜> <🎜> <🎜><🎜> D の右側に PDO、MYSQL_* があります。これは実際には何を意味しますか? これは実際には、より高度な PDO を使用しているか、あるいは古い MYSQL_ * を使用している可能性があります。この場合、mysqli、ADO などを使用している可能性もあります。PHP データベースが混乱しているため、フレームワークでコントラクトを定義する必要があり、すべてのドライバー クラスはこのコントラクトに従って記述および実装されます。このように、ドライバー クラスの基礎となる実装が何であっても、上位層から見える内容は同じです。 <🎜><🎜><🎜> <🎜> <🎜><🎜> 次に、このコントラクトを定義しましょう: <🎜><🎜><🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>01<🎜><🎜> <🎜><🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>インターフェース IDbDriver {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜> 関数実行($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 を閉じることを意味します。

実際、クエリ結果を返すときに、それをイテレータにカプセル化することもできます。

さて、B を見てみましょう。まず、ModelBase を見てみましょう。これは、クエリ、挿入、更新など、外部から見えるさまざまな関数をカプセル化しています。 delete、execute、fetchAll など、つまり B 内のすべてのドライバー クラスは外部から直接アクセスできないため、誰がアクセスできるかというと、ModelBase ですが、直接アクセスするのではなく、ConnectionManager 経由でアクセスします。

ConnectionManager は設定ファイルに従ってドライバーを自動的に選択するため、ModelBase はどのドライバー クラスを呼び出しているかを知りません。ただし、ドライバー クラスはすべてコントラクトに従っているため、ModelBase はどのドライバーを意識する必要はありません。コントラクト上のメソッドを呼び出します。

<テーブル>

01

01

02 class ModelBase extends Base {

03 protected $_db = null;

04 public function __construct() {
<テーブル>

02

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

06     }
クラス ModelBase extends Base {

テーブル>
07     public function execute($sql) {

08         $this->_db->execute($sql);
03 protected $_db = null; テーブル> 04 パブリック関数 __construct() { テーブル> 05 $this->_db = ConnectionManager::getConnection(); テーブル> 06 } テーブル> 07 パブリック関数実行($sql) { テーブル> 08 $this->_db->e​​xecute($sql); テーブル>

09     }

10 }

たとえば、上記のコードでは、ModelBase をインスタンス化するときに、10 個の ModelBase が同時にインスタンス化された場合でも、ConnectionManager の getConnection が呼び出されてデータベース接続を取得します。 , クラスでは、データベース接続操作は 1 回だけです。

上記の規約により、この層で SQL を実行するのは非常に簡単です。ドライバー クラスの実行メソッド、つまり $this->_db->execute($sql); を呼び出すだけです。

ModelBase について説明した後、SQL 解析について説明します。その主な機能は、データベースの ORM を実装するときに SQL 解析が必要になる場合です。

この層は ModelBase からも呼び出されます。呼び出しメソッドは $this->where()->order()->select() です。 , この種の関数チェーンは非常に使いやすいものであり、SQL Parse はこれらの関数の実際の意味を解析して ModelBase に返し、解析された SQL を取得して $this- を実行します。 > ;_db->execute($sql) だけで十分なので、どのようなパターンであっても、最終的にはドライバー クラスのexecuteメソッドが呼び出されて SQL が実行されます。

実際にはテーブルモデルとリレーショナルモデルは ModelBase で一部の操作が完結しているので、テーブルモデルとリレーショナルモデルは ModelBase を継承するだけで分かりやすいです。テーブル モデルは単一のテーブルのコンテンツを処理するため、追加のコンテンツが含まれます。たとえば、$this->select() を実行する場合、システムはクエリのコンテンツを指定できません。クエリを実行するテーブル。おそらく、最終的に解析される SQL は select * from XXX です。これはリレーショナル モデルにも当てはまります。

C と E について説明すると、モデル層は実際には特定のビジネスを実装するためにリレーショナル モデルまたはテーブル モデルのメソッドを呼び出しているだけであることを理解するのは簡単です。

FにはCacheなどの通常のデータベース以外の処理やその他の内容が含まれています。ここではアイデアを話すだけなので、この内容については時間があれば書きます。そうでない場合は、後で話してください。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。