ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP データベース クエリ DB クラス シナリオ分析

ThinkPHP データベース クエリ DB クラス シナリオ分析

咔咔
咔咔オリジナル
2021-01-11 12:08:251821ブラウズ
#"フレームワーク分析もいよいよ終盤に差し掛かります。この記事を読めば、フレームワークのモデルとビューの謎を理解できるようになります。

"

まえがき

日常の開発プロセスでは多くのモデルが使用されますが、開発プロセス 使い方だけは分かるけど、内部でどうやって実装されているのか分からない モデルはインターフェースやバックエンドに関係なく使われるものです。

フロントエンド ビューとバックエンド ビューの分離の一般的な傾向については、フレームワーク内のほとんどのビューは依然としてバックエンド開発に使用されています。

この記事もフレームワークの解釈の最終段階に近づいています。次に、Kaka がフレームワークの Db クラスの謎をみんなに学んでもらいます。

下の写真は、Kaka が提供した脳マップを示しており、この脳マップに基づいて記事を読むことができます。

#データベース実行処理ThinkPHP データベース クエリ DB クラス シナリオ分析

#1. DB操作クラスと他クラスの対応解析モデルを学習する前に知っておく必要があるのは、データベース上で動作する DB クラスです。

フレームワークにはこのような構成ファイルがあり、この構成ファイルにはデータベース構成に関する一連の情報が含まれます。

次のプロセスでは、Kaka はデモンストレーション用のデータベースも作成します。

ThinkPHP データベース クエリ DB クラス シナリオ分析
データベース構成ファイル

フレームワークのコア層には、Db クラスと Model クラスという 2 つのクラスもあります。これら 2 つのクラスは、次の解析対象です。オブジェクト。

ThinkPHP データベース クエリ DB クラス シナリオ分析
フレームワークのコア層が知っておく必要がある 2 つのクラス

Db 操作クラスと他のクラスの対応関係を分析する前に、まず、デモンストレーション用としてのデータベース。

ThinkPHP データベース クエリ DB クラス シナリオ分析
デモ データベース

まず、Db クラスの情報を見てみましょう。

ThinkPHP データベース クエリ DB クラス シナリオ分析
クラスに関するコメント

上の図から、Db クラスに関する情報の一部がわかります。これは、Db クラスのいくつかのクエリ メソッドを使用することです。 DBクラス。

しかし、Db クラスの最後に来ると、おなじみのメソッド __callStatic が表示されます。

ThinkPHP データベース クエリ DB クラス シナリオ分析
宣言されていない静的メソッドの呼び出し

このメソッドは、Kaka の記事を読んでいる読者にはよく知られているはずです。このメソッドは、ファサード ソース コード分析に含まれています。 -深度ルックはそのセクションで提供されます。

このメソッドについて覚えておく必要がある唯一のことは、宣言されていない静的メソッドを呼び出すときにこのメソッドが呼び出されるということです。

call_user_func_array については、このメソッドは組み込み関数であり、関数を実行するために直接呼び出すことができる、つまりメソッドを実行できるため、この関数の使用法を理解できます。直接。

ThinkPHP データベース クエリ DB クラス シナリオ分析
ファサード クラスのソース コード

Db クラスのアノテーション情報を見ると、Db クラスが を使用していることがわかります。 Connection クラス、つまりデータベース接続クラス。

ThinkPHP データベース クエリ DB クラス シナリオ分析
データベース クラスに接続します

このクラスに入り、コンストラクターを確認するだけです。実行シーケンスは以下で説明します。

ThinkPHP データベース クエリ DB クラス シナリオ分析#データベース構成配列により Builder オブジェクトが作成される
フレームワークでコントローラーを操作するための主なシナリオは 2 つあります。1 つ目は Db クラスの操作で、2 つ目は Db クラスの操作です。モデル操作です。

ここで、Connection はコネクタ、Query はクエリ実行者、Builder は SQL ジェネレータ、Exception は例外クラスです。

上記の情報を知っておくと、次の理解プロセスに役立ちます。次のセクションでは、Db クラス ライブラリのシナリオを分析します。

2. Db クラス ライブラリのシナリオ分析

まずは簡単なケースから分析しましょう データベース データ。

ThinkPHP データベース クエリ DB クラス シナリオ分析データベース シミュレーション データ
次に、コントローラーに移動し、簡単なクエリ ケースを作成します。コントローラーを作成する前に、コマンドを使用してテスト コントローラーを作成します。 。

ThinkPHP データベース クエリ DB クラス シナリオ分析
作成されたテスト コントローラー

このコントローラーで簡単なクエリ データを実行します。

ThinkPHP データベース クエリ DB クラス シナリオ分析#単純なケースを使用してデータベース データをクエリする
クエリ結果は次のとおりです

ThinkPHP データベース クエリ DB クラス シナリオ分析クエリ結果
この場合、クエリメソッド

Db::query が使用されていることが分かりますので、次にこのクエリメソッドを簡単に分析してみます。

次に、実行プロセスは Db クラスに移ります。このクラスでは、オブジェクトが存在しない静的メソッドにアクセスすると、__callStatic() メソッドが自動的に呼び出されることを確認できます。

この方法については、以前のファサードの説明で詳しく説明しました。

ThinkPHP データベース クエリ DB クラス シナリオ分析Db クラスの静的メソッド呼び出し
上図からわかるように、存在しないオブジェクトにアクセスする静的メソッドを実行すると、

call_user_func_array はコールバック関数を呼び出し、コールバック関数のパラメータとして配列パラメータを使用します。

その後、コードは

static::connect()# に実行されます。 ##このコード行は、このタイプの Db のためクラスを継承しないため、このクラスを呼び出すために static を使用します。 Db クラスが他のクラスを継承する場合、ある違いが生じます。この違いは static キーワードに関するものです。あまり知られていない知識を少し追加します。クラスがクラスを継承する場合、親クラスが static キーワードを使用すると、デフォルトでサブクラスのメソッドが呼び出されます。

データベース接続の切り替え

継承がないため、このクラスの connect メソッドに行きます。

このクラスでは、最初に結果がデータベース構成情報として返されます。

次に、構成情報からインデックス query が取得され、最終的に文字列 \think\db\Query が返されます。返される文字は String であり、このクラスのインスタンスではありません。

次に、3 番目のステップが実行されてデータベース接続オブジェクト インスタンスが作成され、次にこのステップが分析されます。

ThinkPHP データベース クエリ DB クラス シナリオ分析
データベース接続の切り替え

ファイルに移動します実際の実行は new \think\db\Query であり、最終的には Return してクエリを実行し、データ セットを返します。返されるデータはReturn object(think\db\Query)

About this$this->connection です。 はこのクラス内にあります。 コンストラクターが設定されます。

ThinkPHP データベース クエリ DB クラス シナリオ分析
クエリを実行してデータ セットを返します

このコンストラクターについて簡単に見てみましょう。connection## はこのコンストラクターで直接設定されます. #この属性の値なので、上の図で使用できます。

ThinkPHP データベース クエリ DB クラス シナリオ分析
接続の設定

ここでの実行が完了すると、戻り値は最初から解析された未宣言の静的メソッドに呼び出されます。

static::connect() は最終的な戻り値です。static::connect() は object(think\db\Query) を返します。

ThinkPHP データベース クエリ DB クラス シナリオ分析
静的メソッド呼び出し

したがって、次のコードは thinkphp/library/think/db/Query.php

のクエリ メソッドに対して実行されます。

$sql は Db::query() に渡される SQL ステートメントであり、クエリを実行してデータ セットを返します

コードの最後の部分は think のクエリを実行します\db\connector\Mysql メソッド

ThinkPHP データベース クエリ DB クラス シナリオ分析
クエリを実行してデータ セットを返す

次に think\db\connector\Mysql のクエリ メソッドに進みます。

この方法で中央委員会は3つのことを行いました。

  • $this->initConnect データベース接続を初期化します
  • $this->PDOStatement->execute( ); クエリを実行します
  • ##return $this->getResult($pdo, $procedure); 結果セットを返します
ThinkPHP データベース クエリ DB クラス シナリオ分析クエリを実行してデータ セットを返す

$this->initConnect を解析するデータベース接続を初期化する

#この方法では構成情報の取得が行われていることがわかりますが、まずこの構成情報が何なのかを理解する必要があります。

ThinkPHP データベース クエリ DB クラス シナリオ分析データベース接続の初期化
この構成項目は、構成ファイル データベースで構成されています。コメントで提供された情報によると、次のことがわかります。主にマスター/スレーブサーバーの設定について説明します。

一般に、マスター/スレーブ情報はフレームワーク内で構成されません。ここでは、フレームワークがデータベースのマスター/スレーブ構成をどのように実装するかについては分析しません。

ThinkPHP データベース クエリ DB クラス シナリオ分析データベース配備方式: 0 集中型 (シングルサーバー)、1 分散型 (マスター/スレーブサーバー)
#今回の判定で判定されたのは、現在のデータベース接続を確認し、データベースに接続するメソッドが実行されます。

このメソッドは最終的にオブジェクト(PDO)#33のインスタンス情報を返します。

ThinkPHP データベース クエリ DB クラス シナリオ分析#データベース メソッドの接続
##$this->PDOStatement->execute();

クエリの実行 #2 番目に行うことはクエリの実行です。次に、これがどのように実行されるかを詳しく説明します。

クエリの実行

ThinkPHP データベース クエリ DB クラス シナリオ分析pdo インスタンスを返すとき、このインスタンスは属性
$this->PDOStatement
に割り当てられます。 PDO クラスで実行されます。

ここで理解する必要があるのは、execute メソッドです。このメソッドは、複数の結果セット、複数の更新カウント、またはその両方の組み合わせを返すステートメントを実行するために使用されます。

3 番目のことは、結果セットを返すことです。

この時点までの実行の最後のステップは、結果セットを返すことです。 ここで使用されるメソッドは、最下層をクエリしてからそれを解析し、最終的なクエリ結果がここに返されます。

データセット配列の取得

ThinkPHP データベース クエリ DB クラス シナリオ分析最終結果はここの
__callStatic
メソッドに返され、上位層に返されます。
$ res

変数。 <figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/650/971/824/1610337895922810.png" title="1610337895922810.png" alt="ThinkPHP データベース クエリ DB クラス シナリオ分析"><figcaption style="max-width:90%">テストケース</figcaption></figure><figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/275/438/415/1610337885263590.png" title="1610337885263590.png" alt="ThinkPHP データベース クエリ DB クラス シナリオ分析"><figcaption style="max-width:90%">最終クエリ結果</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">ここまでは、Db クエリを使用した実行プロセスです。を解析しましたが、フレームワークでカプセル化されているメソッドはクエリだけではなく、他のクエリメソッドもKakaの処理に従って簡単に解析できます。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">このセクションの最後のいくつかのプロセスは最後に実行されますが、以前の実行とは少し異なります。 </p> <blockquote class="multiquote-1" data-tool="mdnice编辑器" style="border: none; font-size: 0.9em; overflow: auto; margin-bottom: 20px; margin-top: 20px; padding: 15px 10px; line-height: 1.75; border-radius: 13px; color: rgb(53, 53, 53); background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"> <span style="display: block; font-size: 2em; color: rgb(248, 57, 41); font-family: Arial, serif; line-height: 1em; font-weight: 700;">「</span><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; font-size: 16px; margin: 0px 10px;">学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」 Silk のお手伝いをします。私の名前はカカです。また次回お会いしましょう。</p> <span style="float: right; display: block; font-size: 2em; color: rgb(248, 57, 41); font-family: Arial, serif; line-height: 1em; font-weight: 700;">”</span> </blockquote>

以上がThinkPHP データベース クエリ DB クラス シナリオ分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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