Heim  >  Artikel  >  PHP-Framework  >  Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse

咔咔
咔咔Original
2021-01-11 12:08:251724Durchsuche
"

Wir sind endlich am Ende der Framework-Analyse angelangt. Dieser Artikel führt Sie dazu, die Geheimnisse der Modelle und Ansichten im Framework zu verstehen.

"

Vorwort

Im täglichen Entwicklungsprozess gibt es viele Verwendungsmöglichkeiten für Modelle, aber während des Entwicklungsprozesses wissen wir nur, wie man sie verwendet, aber wir wissen nicht, wie man sie intern implementiert. Modelle werden unabhängig von der Schnittstelle oder verwendet das Backend.

Im Hinblick auf den allgemeinen Trend der Trennung von Front- und Backend-Ansichten werden die meisten Ansichten im Framework immer noch für die Backend-Entwicklung verwendet.

Dieser Artikel nähert sich auch der letzten Phase der Interpretation des Frameworks. Als nächstes wird Kaka alle dazu bringen, die Geheimnisse der Db-Klasse im Framework kennenzulernen.

Das Bild unten zeigt die von Kaka bereitgestellte Gehirnkarte. Sie können den Artikel basierend auf dieser Gehirnkarte lesen.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Datenbankausführungsprozess

1. Analyse der entsprechenden Beziehung zwischen der DB-Operationsklasse und anderen Klassen

Was Sie vor dem Erlernen des Modells wissen müssen, ist die DB-Klasse, die auch die Datenbank betreibt .

Es gibt eine solche Konfigurationsdatei im Framework, und in dieser Konfigurationsdatei gibt es eine Reihe von Informationen zur Datenbankkonfiguration.

Im nächsten Prozess wird Kaka auch einfach eine Datenbank zur Demonstration erstellen.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Datenbankkonfigurationsdatei

Es gibt auch zwei Klassen in der Kernschicht des Frameworks, nämlich die Db-Klasse und die Model-Klasse. Diese beiden Klassen sind die nächsten Analyseobjekte.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Zwei Klassen, die die Kernschicht des Frameworks kennen muss

Bevor wir die entsprechende Beziehung zwischen der Db-Operationsklasse und anderen Klassen analysieren, erstellen wir zunächst eine Datenbank zur Demonstrationsverwendung.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Demo-Datenbank

Werfen wir zunächst einen Blick auf die Db-Klasseninformationen.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Klassenanmerkungen

Im obigen Bild können wir einen Teil der Informationen über die Db-Klasse sehen, nämlich die Verwendung einiger Abfragemethoden der Db-Klasse.

Aber am Ende der Db-Klasse sehen Sie eine bekannte Methode __callStatic. __callStatic

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
调用没有声明的静态方法

这个方法在一直读咔咔文章的读者应该已经很是熟悉了,这个方法在门面源码解析那一节中进行过深入的了解。

对于这个方法只需要记住的是在调用没有声明的静态方法时会进行调用。

至于call_user_func_array

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse🎜Rufnr Deklarierte statische Methode🎜🎜🎜Diese Methode sollte Lesern bekannt sein, die Kakas Artikel gelesen haben. Diese Methode wurde im Abschnitt über die Analyse des Fassadenquellcodes gründlich verstanden. 🎜🎜Das Einzige, was Sie bei dieser Methode beachten sollten, ist, dass sie aufgerufen wird, wenn eine nicht deklarierte statische Methode aufgerufen wird. 🎜🎜Was call_user_func_arrayDie Verwendung davon Funktion kann Es versteht sich, dass diese Methode eine integrierte Funktion ist und direkt aufgerufen werden kann, um die Funktion auszuführen, dh die Methode kann direkt ausgeführt werden. 🎜
Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Der Quellcode der Fassadenklasse

Wenn Sie sich gerade die Anmerkungsinformationen der Db-Klasse angesehen haben, können Sie sehen, dass die Db-Klasse Connectiondiese Klasse verwendet, bei der es sich um die Datenbankverbindungsklasse handelt.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Verbinden Sie sich mit der Datenbankklasse

Geben Sie diese Klasse ein und schauen Sie sich einfach den Konstruktor an. Die laufende Reihenfolge wird unten erklärt.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Erstellen Sie ein Builder-Objekt aus dem Datenbankkonfigurationsarray.

Es gibt zwei Hauptszenarien für den Betrieb des Controllers im Framework. Das erste ist der DB-Klassenbetrieb und das zweite der Modellbetrieb.

Wobei Connection· der Connector, Query die Abfrage, Builder der SQL-Generator und Exception die Exception-Klasse ist.

Die Kenntnis der oben genannten Informationen wird für den nächsten Verständnisprozess hilfreich sein. Im nächsten Abschnitt wird das Db-Klassenbibliotheksszenario analysiert.

2. Szenarioanalyse der DB-Klassenbibliothek

Analysieren wir es anhand eines einfachen Falls und schauen wir uns zunächst die Datenbankdaten an.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Datenbanksimulationsdaten

Gehen Sie dann zum Controller und schreiben Sie einen einfachen Abfragefall. Bevor Sie den Controller erstellen, verwenden Sie den Befehl, um einen Testcontroller zu erstellen.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Erstellter Testcontroller

Führen Sie einfache Abfragedaten in diesem Controller durch.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Verwenden Sie einen einfachen Fall, um Datenbankdaten abzufragen

Die Abfrageergebnisse lauten wie folgt

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Abfrageergebnisse

In diesem Fall können Sie das Db::query ist eine Abfragemethode. Als nächstes werden wir diese Abfragemethode kurz analysieren. Db::query这种查询方式,接下来对于这种查询方式进行简单的剖析。

接着执行流程就会来到Db这个类,在这个类中可以看到关于当对象访问不存在的静态方法时,__callStatic()方法会被自动调用。

这个方法在之前门面的讲解中进行了深度讲解。

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Db类中的静态调用方法

从上图可以看到当执行访问对象不存在的静态方法时会执行到call_user_func_array调用回调函数,并把一个数组参数作为回调函数的参数

接着代码就会执行到static::connect()

Dann kommt der Ausführungsprozess zur Db-Klasse. In dieser Klasse können Sie sehen, dass die __callStatic()-Methode automatisch aufgerufen wird, wenn das Objekt auf eine nicht vorhandene statische Methode zugreift.

Diese Methode wurde in der vorherigen Erläuterung der Fassade ausführlich erläutert. 🎜🎜Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse🎜Db-Klasse Die statische Aufrufmethode in 🎜🎜🎜Wie Sie auf dem Bild oben sehen können, wird beim Ausführen einer statischen Methode, die auf ein nicht vorhandenes Objekt zugreift, diese mit call_user_func_array ruft die Rückruffunktion auf und verwendet einen Array-Parameter als Parameter der Rückruffunktion🎜🎜Dann wird der Code sein ausgeführt bis<span style="font-weight: 700; color: rgb(248, 57, 41);">Datenbankverbindung wechseln</span><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Da es keine Vererbung gibt, gelangen Sie zur Verbindungsmethode dieser Klasse. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">In dieser Klasse wird das Ergebnis zunächst als Datenbankkonfigurationsinformationen zurückgegeben. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Dann wird der <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba" aus der konfiguration abgerufen information schriftfamilie: operator mono consolas monaco monospace code>Dieser Index gibt letztendlich zurück<code style="font-size: 14px; Zeilenumbruch: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27, 31,35,.05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; color: rgb(271, 93, 108);">thinkdbQuerythis String, hier ist zu beachten, dass der zurückgegebene String keine Instanz dieser Klasse ist. query这个索引,最终返回thinkdbQuery这个字符串,这里一定要注意返回的是字符串,不是这个类的实例。

紧接着就会执行到第三步创建数据库连接对象实例,接下里将会对这一步进行解析。

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
切换数据库连接

紧接着会来到文件实际执行的为 new thinkdbQuery,最终会返回执行查询 返回数据集,返回数据为返回 object(thinkdbQuery)

关于这个$this->connection是在本类的构造函数进行设置的。

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
执行查询 返回数据集

先简单的看一下这个构造函数,在这个构造函数中直接就设置了connection

Dann wird der dritte Schritt ausgeführt, um eine Datenbankverbindungsobjektinstanz zu erstellen. Dieser Schritt wird als Nächstes analysiert. 🎜
Datenbankverbindung wechseln🎜Sie gelangen dann zur DateiReturn object(thinkdbQuery)Info dazu$this->connection wird im Konstruktor dieser Klasse festgelegt. 🎜
Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Abfrage ausführen, um Daten zurückzugeben Set
🎜Werfen wir einen kurzen Blick auf diesen Konstruktor. In diesem Konstruktor setzen wir direkt connectionDer Wert dieses Attributs, sodass es im obigen Bild verwendet werden kann. 🎜
Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Richten Sie die Verbindung ein

Nachdem die Ausführung hier abgeschlossen ist, wird der zurückgegebene Wert an die nicht deklarierte statische Methode aufgerufen, die von Anfang an analysiert wurde.

wherestatic::connect() Es ist der endgültig zurückgegebene Wertstatic::connect() 返回 object(thinkdbQuery)

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
静态方法调用

所以接下来代码会执行到  thinkphp/library/think/db/Query.php 的 query方法

$sql

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse

Statische Methode Rufen Sie

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse auf, damit der nächste Code für die Abfragemethode von thinkphp/library/think/db/Query.php ausgeführt wird
$sql ist die in Db::query() übergebene SQL-Anweisung, und die Abfrage wird ausgeführt, um den Datensatz zurückzugeben

Das letzte Stück Der Code führt die thinkdbconnectorMysql-Abfragemethode aus

🎜 Führen Sie die Abfrage aus und geben Sie den Datensatz zurück 🎜🎜🎜 Kommen Sie als Nächstes zur Abfragemethode von thinkdbconnectorMysql 🎜🎜 Diese Methode erledigt hauptsächlich drei Dinge. 🎜
  • $this->initConnect;初始化数据库连接<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">$this->initConnect 初始化数据库连接
  • $this->PDOStatement->execute(); 执行查询
  • return $this->getResult($pdo, $procedure);
$this->PDOStatement ->execute(); 执行查询
Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
return $this->getResult($pdo, $procedure); >initConnect ist eine neue Funktion连接

在这个方法中可以看到是进行了一次配置信息获取,首先需要明白这个配置信息是什么.

初始化数据库连接
Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
这个配置项是在配置文件database中配置的,根据注释提供的信息可以看到主要是关于主从服务器设置的.
一般情况下是不会在框架中配置主从信息的,这里就不去解析框架是如何实现数据库的从配置了.

数据库部署方式:0 集中式(单一服务器),1. 分布式(主从服务器)
Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
在这个判断中在进行了一次判断当前数据库连接的id,然后执行了连接数据库方法.
这个方法最终会返回object(PDO)#33的一个实例信息.

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
Methode „Mit Datenbank verbinden“

$this - >PDOStatement->execute(); Abfrage ausführen$this->PDOStatement->execute(); 执行查询

第二件事情做的就是执行查询,接下来我们来详细说明一下这个到底是如何执行的。

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
执行查询

在返回pdo实例时,将这个实例赋值给了$this->PDOStatement这个属性,所以会去PDO类中进行执行。

在这里大家需要明白一件事情就是关于execute这个方法,用于执行返回多个结果集、多个更新计数或二者组合的语句。

第三件事情返回结果集

直到这里就是执行的最后一步就是返回结果集。

这里使用的方法都是查询底层,就在去解析了,在这里就会返回最终查询结果。

Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse
获得数据集数组

最终结果就会返回给这里__callStatic方法,并且返回给上层的$res

Als nächstes müssen wir die Abfrage im Detail erklären. 🎜🎜Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse🎜Abfrage ausführen 🎜🎜🎜Wenn Sie die PDO-Instanz zurückgeben, weisen Sie diese Instanz zu 🎜Daten abrufen Legen Sie das Array fest. Das Endergebnis wird hier zurückgegeben. Farbe: rgba(27,31,35,.05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; Farbe: rgb(271, 93, 108);"> __callStatic
-Methode und kehrt zur oberen Variablen. 🎜<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="Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse"><figcaption style="max-width:90%">Testfall</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="Szenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse"><figcaption style="max-width:90%">Endgültiges Abfrageergebnis</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;">Bis zu diesem Punkt wurde der Ausführungsprozess der Verwendung von DB-Abfragen analysiert, aber die vom Framework gekapselte Methode ist nicht nur eine Abfrage, sondern auch andere Abfragemethoden können dies sein folgt: Der Prozess führt eine einfache Analyse durch. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Die letzten paar Prozesse in diesem Abschnitt werden am Ende ausgeführt, es wird jedoch einen kleinen Unterschied zu den vorherigen Ausführungen geben. </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;">Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere vertritt. Ich hoffe, dass Kakas Artikel im riesigen Internet Ihnen ein wenig helfen können Kaka, wir sehen uns in der nächsten Ausgabe.</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>

Das obige ist der detaillierte Inhalt vonSzenarioanalyse der ThinkPHP-Datenbankabfrage Db-Klasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn