"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.
"
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.
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.
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.
Bevor wir die entsprechende Beziehung zwischen der Db-Operationsklasse und anderen Klassen analysieren, erstellen wir zunächst eine Datenbank zur Demonstrationsverwendung.
Werfen wir zunächst einen Blick auf die Db-Klasseninformationen.
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
。
这个方法在一直读咔咔文章的读者应该已经很是熟悉了,这个方法在门面源码解析那一节中进行过深入的了解。
对于这个方法只需要记住的是在调用没有声明的静态方法时会进行调用。
至于call_user_func_array
call_user_func_array
Die 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. 🎜Wenn Sie sich gerade die Anmerkungsinformationen der Db-Klasse angesehen haben, können Sie sehen, dass die Db-Klasse Connection
diese Klasse verwendet, bei der es sich um die Datenbankverbindungsklasse handelt.
Geben Sie diese Klasse ein und schauen Sie sich einfach den Konstruktor an. Die laufende Reihenfolge wird unten erklärt.
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.
Analysieren wir es anhand eines einfachen Falls und schauen wir uns zunächst die Datenbankdaten an.
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.
Führen Sie einfache Abfragedaten in diesem Controller durch.
Die Abfrageergebnisse lauten wie folgt
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()方法会被自动调用。
这个方法在之前门面的讲解中进行了深度讲解。
从上图可以看到当执行访问对象不存在的静态方法时会执行到call_user_func_array调用回调函数,并把一个数组参数作为回调函数的参数
接着代码就会执行到static::connect()
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);">thinkdbQuery
this String, hier ist zu beachten, dass der zurückgegebene String keine Instanz dieser Klasse ist. query
这个索引,最终返回thinkdbQuery
这个字符串,这里一定要注意返回的是字符串,不是这个类的实例。
紧接着就会执行到第三步创建数据库连接对象实例,接下里将会对这一步进行解析。
紧接着会来到文件实际执行的为 new thinkdbQuery
,最终会返回执行查询 返回数据集,返回数据为返回 object(thinkdbQuery)
关于这个$this->connection
是在本类的构造函数进行设置的。
先简单的看一下这个构造函数,在这个构造函数中直接就设置了connection
Return object(thinkdbQuery)
Info dazu$this->connection
wird im Konstruktor dieser Klasse festgelegt. 🎜🎜Werfen wir einen kurzen Blick auf diesen Konstruktor. In diesem Konstruktor setzen wir direkt connection
Der Wert dieses Attributs, sodass es im obigen Bild verwendet werden kann. 🎜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)
。
所以接下来代码会执行到 thinkphp/library/think/db/Query.php 的 query方法
$sql
Statische Methode Rufen Sie
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();
执行查询在这个方法中可以看到是进行了一次配置信息获取,首先需要明白这个配置信息是什么.
初始化数据库连接一般情况下是不会在框架中配置主从信息的,这里就不去解析框架是如何实现数据库的从配置了. 数据库部署方式:0 集中式(单一服务器),1. 分布式(主从服务器)这个方法最终会返回object(PDO)#33的一个实例信息.$this - >PDOStatement->execute();
Abfrage ausführen$this->PDOStatement->execute();
执行查询
第二件事情做的就是执行查询,接下来我们来详细说明一下这个到底是如何执行的。
在返回pdo实例时,将这个实例赋值给了$this->PDOStatement
这个属性,所以会去PDO类中进行执行。
在这里大家需要明白一件事情就是关于execute这个方法,用于执行返回多个结果集、多个更新计数或二者组合的语句。
第三件事情返回结果集
直到这里就是执行的最后一步就是返回结果集。
这里使用的方法都是查询底层,就在去解析了,在这里就会返回最终查询结果。
最终结果就会返回给这里__callStatic
方法,并且返回给上层的$res
🎜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 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!