#"フレームワーク分析もいよいよ終盤に差し掛かります。この記事を読めば、フレームワークのモデルとビューの謎を理解できるようになります。 "
フレームワークのコア層には、Db クラスと Model クラスという 2 つのクラスもあります。これら 2 つのクラスは、次の解析対象です。オブジェクト。
Db 操作クラスと他のクラスの対応関係を分析する前に、まず、デモンストレーション用としてのデータベース。
まず、Db クラスの情報を見てみましょう。
上の図から、Db クラスに関する情報の一部がわかります。これは、Db クラスのいくつかのクエリ メソッドを使用することです。 DBクラス。
しかし、Db クラスの最後に来ると、おなじみのメソッド __callStatic
が表示されます。
このメソッドは、Kaka の記事を読んでいる読者にはよく知られているはずです。このメソッドは、ファサード ソース コード分析に含まれています。 -深度ルックはそのセクションで提供されます。
このメソッドについて覚えておく必要がある唯一のことは、宣言されていない静的メソッドを呼び出すときにこのメソッドが呼び出されるということです。
call_user_func_array
については、このメソッドは組み込み関数であり、関数を実行するために直接呼び出すことができる、つまりメソッドを実行できるため、この関数の使用法を理解できます。直接。
Db クラスのアノテーション情報を見ると、Db クラスが を使用していることがわかります。 Connection
クラス、つまりデータベース接続クラス。
このクラスに入り、コンストラクターを確認するだけです。実行シーケンスは以下で説明します。
フレームワークでコントローラーを操作するための主なシナリオは 2 つあります。1 つ目は Db クラスの操作で、2 つ目は Db クラスの操作です。モデル操作です。 ここで、Connection はコネクタ、Query はクエリ実行者、Builder は SQL ジェネレータ、Exception は例外クラスです。 上記の情報を知っておくと、次の理解プロセスに役立ちます。次のセクションでは、Db クラス ライブラリのシナリオを分析します。このコントローラーで簡単なクエリ データを実行します。
クエリ結果は次のとおりです この場合、クエリメソッドDb::query が使用されていることが分かりますので、次にこのクエリメソッドを簡単に分析してみます。
call_user_func_array はコールバック関数を呼び出し、コールバック関数のパラメータとして配列パラメータを使用します。
static::connect()# に実行されます。 ##このコード行は、このタイプの Db のためクラスを継承しないため、このクラスを呼び出すために static を使用します。 Db クラスが他のクラスを継承する場合、ある違いが生じます。この違いは static キーワードに関するものです。あまり知られていない知識を少し追加します。クラスがクラスを継承する場合、親クラスが static キーワードを使用すると、デフォルトでサブクラスのメソッドが呼び出されます。
データベース接続の切り替え
継承がないため、このクラスの connect メソッドに行きます。
このクラスでは、最初に結果がデータベース構成情報として返されます。
次に、構成情報からインデックス query
が取得され、最終的に文字列 \think\db\Query
が返されます。返される文字は String であり、このクラスのインスタンスではありません。
次に、3 番目のステップが実行されてデータベース接続オブジェクト インスタンスが作成され、次にこのステップが分析されます。
ファイルに移動します実際の実行は new \think\db\Query
であり、最終的には Return してクエリを実行し、データ セットを返します。返されるデータはReturn object(think\db\Query)
About this$this->connection です。
はこのクラス内にあります。 コンストラクターが設定されます。
このコンストラクターについて簡単に見てみましょう。connection## はこのコンストラクターで直接設定されます. #この属性の値なので、上の図で使用できます。
ここでの実行が完了すると、戻り値は最初から解析された未宣言の静的メソッドに呼び出されます。
static::connect()
は最終的な戻り値です。static::connect() は object(think\db\Query)
を返します。
したがって、次のコードは thinkphp/library/think/db/Query.php
のクエリ メソッドに対して実行されます。$sql
は Db::query() に渡される SQL ステートメントであり、クエリを実行してデータ セットを返します
コードの最後の部分は think のクエリを実行します\db\connector\Mysql メソッド
次に think\db\connector\Mysql のクエリ メソッドに進みます。
この方法で中央委員会は3つのことを行いました。
$this->initConnect
データベース接続を初期化します$this->PDOStatement->execute( );
クエリを実行します 結果セットを返します
$this->initConnect を解析するデータベース接続を初期化する
#この方法では構成情報の取得が行われていることがわかりますが、まずこの構成情報が何なのかを理解する必要があります。 この構成項目は、構成ファイル データベースで構成されています。コメントで提供された情報によると、次のことがわかります。主にマスター/スレーブサーバーの設定について説明します。 一般に、マスター/スレーブ情報はフレームワーク内で構成されません。ここでは、フレームワークがデータベースのマスター/スレーブ構成をどのように実装するかについては分析しません。 #今回の判定で判定されたのは、現在のデータベース接続を確認し、データベースに接続するメソッドが実行されます。 このメソッドは最終的にオブジェクト(PDO)#33のインスタンス情報を返します。##$this->PDOStatement->execute();
クエリの実行 #2 番目に行うことはクエリの実行です。次に、これがどのように実行されるかを詳しく説明します。
クエリの実行
ここで理解する必要があるのは、execute メソッドです。このメソッドは、複数の結果セット、複数の更新カウント、またはその両方の組み合わせを返すステートメントを実行するために使用されます。
この時点までの実行の最後のステップは、結果セットを返すことです。 ここで使用されるメソッドは、最下層をクエリしてからそれを解析し、最終的なクエリ結果がここに返されます。
データセット配列の取得
$ 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 サイトの他の関連記事を参照してください。