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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-21 08:50:44
オリジナル
1212 人が閲覧しました

前回、モデルのドライバー クラスを実装しました。ConnectionManager は構成ファイルで構成されたドライバー名に従ってドライバー クラスをインスタンス化する必要があるため、最初にドライバー名を構成ファイルに追加します。

01
01

02 return array(

03 'defaultController' => 'Index',
テーブル>

04     'defaultAction' => 'index',
02

05     'debug' => true,

配列を返す(

06     'errorReporting' => -1,
テーブル>

07     'timeZone' => 'PRC',

03

08     'db' => array(

09         'dsn' => 'mysql:dbname=test;host=localhost',
'defaultController' => 'インデックス',

テーブル>
10         'user' => 'test',

11         'pwd' => 'test',
04

12         'driver' => 'pdo'
'defaultAction' => 'インデックス', テーブル> 05 'デバッグ' => true、 テーブル> 06 'errorReporting' => -1, テーブル> 07 'timeZone' => 'PRC', テーブル> 08 'db' => 配列( テーブル> 09 'dsn' => 'mysql:dbname=test;host=localhost', テーブル> 10 'ユーザー' => 'テスト'、 テーブル> 11 'pwd' => 'テスト'、 テーブル> 12 'ドライバー' => 'pdo' テーブル>

13     )

14 );

ここの db の下にあるドライバーがドライバー名です。

構成ファイルが完成したら、ConnectionManager クラスの 2 つの静的メソッド getConnection と releaseConnection の実装は非常に簡単です。まず、getConnection が構成ファイル内の構成に従ってドライバー クラスを選択します。もちろん、将来的には複数のモデル ファイルが存在する可能性があり、データベース接続は 1 つだけにするのが最善であるため、この場所はシングルトンでなければなりません。 releaseConnection はさらに単純で、ドライバー クラスの close メソッドを呼び出すだけです。直接。

01

01

02 class ConnectionManager extends Base {

03 private static $_instance = null;

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

02

05 if(self::$_instance == null) {

06 //按照配置文件寻找驱动类,然后连接DB
クラス ConnectionManager は Base {

を拡張します

07 switch(C('db=>driver')) {

08                 case 'pdo' :
03 プライベート静的 $_instance = null; テーブル> 04 パブリック静的関数 getConnection() { テーブル> 05 if(self::$_instance == null) { テーブル> 06 //設定ファイルに従ってドライバークラスを検索し、DB に接続します テーブル> 07 switch(C('db=>driver')) { テーブル> 08 ケース 'pdo' : テーブル>

09                     self::$_instance = new PdoDriver();

10                     break;

11                 default :

12                     self::$_instance = new PdoDriver();

13                     break;

14             }

15         }

16         return self::$_instance;

17     }

18     public static function releaseConnection() {

19         if(null !== self::$_instance) {

20             self::$_instance.close();

21         }

22     }

23 }

ConnectionManager を作成した後、ModelBase について説明します。このクラスは、後続のテーブル モデルとリレーショナル モデルの親クラスであるため、基本的に、execute、select、および外部からアクセスできるすべてのインターフェイスを定義します。更新、挿入、削除など。次に、比較的単純な ModelBase を作成しましょう。この例では、constructor、execute、getAll の 3 つのメソッドだけが SQL を実行し、getAll はデータを取得します。

注: 前に述べたように、オブジェクト、通常の配列、またはイテレータに従ってデータを返すことができる場合、ここでの getAll はより複雑になりますが、今回は getAll で直接 getAllByAssocArray を呼び出すため、このメソッドは非常に簡単です。

それでは、早速コードを投稿してみましょう。 !

01

01

02 class ModelBase extends Base {

03 protected $_db = null;

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

02

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

06     }
クラス ModelBase は Base {

を拡張します テーブル>
07     public function execute($sql,Array $arr) {
03 protected $_db = null; テーブル> 04 パブリック関数 __construct() { テーブル> 05 $this->_db = ConnectionManager::getConnection(); テーブル> 06 } テーブル> 07 パブリック関数execute($sql,Array $arr) { テーブル>

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

09         $this->_db->execute($arr);

10     }

11     public function getAll() {

12         return $this->_db->getAllByAssocArray();

13     }

14 }

ここには数行のコードがないので、より複雑なことについては説明しません。 。 。

以前に SQL 解析を B に分割しました。これにより主に SQL 解析が完了します。単純なクエリ ステートメントの形式は次のとおりであることがわかっています。

SELECT [ALLDISTINCT] フィールド FROM テーブル WHERE whereCondition [GROUP BY groupCondition] [HAVING gettingCondition] [ORDER BY orderCondition]

以前は SQL 文字列を直接記述していましたが、この方法では SQL コンテンツの一部を指定するだけであれば、他のコンテンツ フレームワークを自動的に完成させることができ、メンテナンスが容易になります。もちろん、複雑な SQL にはこれをお勧めしません。

たとえば、テーブル モデルではテーブル名を指定しているため、フレームワークはテーブルを識別できる必要があり、フィールド部分はデフォルトで * にできますが、whereCondition がない場合は識別できません。 All Or DISTINCT のデフォルトは ALL です。

次に、テーブル モデルで関連付けられたテーブルが user であると仮定し、$this->select() を実行します。元の観点によれば、システムはクエリ ステートメントが何であるかを知りません。当然実行できませんが、フレームワークが SQL を自動的に完了できる場合、SQL は次のようになります:

ユーザーから * を選択

このような SQL ステートメントには問題はありません。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート