>PHP 프레임워크 >ThinkPHP >ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석

咔咔
咔咔원래의
2021-01-11 12:08:251825검색
"

드디어 프레임워크 분석이 끝났습니다. 이 글을 통해 프레임워크 내 모델과 뷰의 신비를 이해하게 될 것입니다.

"

머리말

일상의 개발 과정에서 모델을 사용하는 경우는 많지만, 개발 과정에서는 사용법만 알 뿐, 내부적으로 구현하는 방법은 모릅니다. 모델은 인터페이스나 인터페이스와 상관없이 사용되는 것입니다. 백엔드.

프런트엔드 뷰와 백엔드 뷰를 분리하는 일반적인 추세와 관련하여 프레임워크의 뷰 대부분은 여전히 ​​백엔드 개발에 사용됩니다.

이 글도 프레임워크를 해석하는 마지막 단계입니다. 다음으로 Kaka는 프레임워크에서 Db 클래스의 신비를 모두가 배울 수 있도록 유도할 것입니다.

아래 사진은 카카에서 제공하는 뇌 지도를 바탕으로 기사를 읽어보실 수 있습니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 실행 과정

1. Db 연산 클래스와 다른 클래스의 대응 관계 분석

모델을 배우기 전에 꼭 알아야 할 것은 데이터베이스를 운용하는 DB 클래스이다. .

프레임워크에는 이러한 구성 파일이 있으며, 이 구성 파일에는 데이터베이스 구성에 대한 일련의 정보가 있습니다.

다음 과정에서는 Kaka도 간단히 시연용 데이터베이스를 생성할 예정입니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 구성 파일

프레임워크의 핵심 계층에도 두 개의 클래스, 즉 Db 클래스와 Model 클래스가 있습니다. 이 두 클래스는 다음 구문 분석 개체입니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
프레임워크의 핵심 계층이 알아야 할 두 가지 클래스

Db 작업 클래스와 다른 클래스 간의 대응 관계를 분석하기 전에 먼저 데모용 데이터베이스를 생성합니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
Demo 데이터베이스

먼저 Db 클래스 정보를 살펴보겠습니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
클래스 주석

위 그림을 통해 Db 클래스의 일부 쿼리 메소드를 사용하는 Db 클래스에 대한 정보의 일부를 볼 수 있습니다.

하지만 Db 클래스의 마지막에는 익숙한 메서드 __callStatic. __callStatic

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
调用没有声明的静态方法

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

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

至于call_user_func_array

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석🎜전화번호 선언된 정적 메서드🎜🎜🎜이 메서드는 Kaka의 기사를 읽어온 독자들에게 익숙할 것입니다. 이 메서드는 Facade 소스 코드 분석 섹션에서 깊이 이해되었습니다. 🎜🎜이 메서드에 대해 기억해야 할 유일한 점은 선언되지 않은 정적 메서드가 호출될 때 호출된다는 것입니다. 🎜🎜 call_user_func_array function can 이 메소드는 내장 함수이고 함수를 실행하기 위해 직접 호출할 수 있음, 즉 메소드를 직접 실행할 수 있음을 이해합니다. 🎜
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
Facade 클래스의 소스코드

Db 클래스의 Annotation 정보만 보면, Db 클래스는 데이터베이스 연결 클래스인 Connection이 클래스를 사용하고 있음을 알 수 있습니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 클래스에 연결

이 클래스에 들어가서 간단히 생성자를 보면 실행 순서가 아래에 설명됩니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 구성 배열에서 Builder 개체 만들기

프레임워크에서 컨트롤러를 작동하는 데는 두 가지 주요 시나리오가 있습니다. 첫 번째는 Db 클래스 작업이고 두 번째는 모델 작업입니다.

Connection·은 커넥터, Query는 쿼리, Builder는 SQL 생성기,Exception은 예외 클래스입니다.

위의 정보를 알아두면 다음 이해 과정에서 도움이 될 것입니다. 다음 섹션에서는 Db 클래스 라이브러리 시나리오를 분석하겠습니다.

2. DB 클래스 라이브러리 시나리오 분석

간단한 사례로 분석해 먼저 데이터베이스 데이터를 살펴보겠습니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 시뮬레이션 데이터

그런 다음 컨트롤러로 이동하여 간단한 쿼리 케이스를 작성하고 컨트롤러를 만들기 전에 명령을 사용하여 테스트 컨트롤러를 만듭니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
생성된 테스트 컨트롤러

이 컨트롤러에서 간단한 쿼리 데이터를 수행합니다.

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
간단한 사례를 사용하여 데이터베이스 데이터를 쿼리합니다

쿼리 결과는 다음과 같습니다

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
쿼리 결과

이 경우 Db::query는 쿼리 메서드입니다. 다음으로 이 쿼리 메서드를 간략하게 분석하겠습니다. Db::query这种查询方式,接下来对于这种查询方式进行简单的剖析。

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

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

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
Db类中的静态调用方法

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

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

그러면 실행 프로세스가 Db 클래스로 오게 됩니다. 이 클래스에서는 객체가 존재하지 않는 정적 메서드에 액세스할 때 __callStatic() 메서드가 자동으로 호출되는 것을 볼 수 있습니다.

이 방법은 이전 파사드 설명에서 자세히 설명했습니다. 🎜🎜ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석🎜Db 클래스 🎜🎜🎜의 정적 호출 메소드 위 그림에서 볼 수 있듯이 존재하지 않는 개체에 액세스하는 정적 메소드를 실행하면 call_user_func_array는 콜백 함수를 호출하고 배열 매개변수를 콜백 함수의 매개변수로 사용합니다.🎜🎜그러면 코드는 다음과 같습니다. static::connect() 코드 줄. 이 Db 클래스는 어떤 클래스도 상속하지 않기 때문에 static을 사용하여 이 클래스를 호출합니다. 🎜🎜Db 클래스가 다른 클래스를 상속하는 경우에는 약간의 차이가 있습니다. 이 차이점은 static 키워드에 관한 것입니다. 클래스가 클래스를 상속할 때 부모에서 static을 사용하는 것이 좋습니다. class.keyword에서는 하위 클래스의 메서드가 기본적으로 호출됩니다. 🎜

Switch 데이터베이스 연결

상속이 없으므로 이 클래스의 연결 방법을 사용하게 됩니다.

이 클래스에서는 결과가 먼저 데이터베이스 구성 정보로 반환됩니다.

그러면 query이 인덱스는 궁극적으로 <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); 글꼴 계열: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all;">thinkdbQuery String, 여기서는 반환된 문자열이 이 클래스의 인스턴스가 아니라는 점에 유의해야 합니다. query这个索引,最终返回thinkdbQuery这个字符串,这里一定要注意返回的是字符串,不是这个类的实例。

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

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
切换数据库连接

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

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

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
执行查询 返回数据集

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

그런 다음 세 번째 단계가 실행되어 데이터베이스 연결 개체 인스턴스를 생성합니다. 이 단계는 다음으로 분석됩니다. 🎜
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 연결 전환 / figcaption>
🎜그런 다음 Return object(thinkdbQuery)🎜🎜이 정보$this->connection이 이 클래스의 생성자에 설정됩니다. 🎜
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
쿼리를 실행하여 데이터 반환 Set
🎜이 생성자를 간략하게 살펴보겠습니다. 이 생성자에서는 connection 이 속성의 값이므로 위 그림에서 사용할 수 있습니다. 🎜
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
연결 설정

여기서 실행이 완료된 후 반환된 값은 처음부터 파싱되었던 선언되지 않은 정적 메서드로 호출됩니다.

wherestatic::connect() 최종 반환 값입니다static::connect() 반환 개체(thinkdbQuery). static::connect()就是最终返回的值static::connect() 返回 object(thinkdbQuery)

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
静态方法调用

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

$sql

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석

정적 메서드

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석를 호출하면 thinkphp/library/think/db/Query.php
$sql은 Db::query()에 전달된 SQL 문이며, 쿼리가 실행되어 데이터 세트를 반환합니다

마지막 조각 코드 중 thinkdbconnectorMysql 쿼리 메서드가 실행됩니다

🎜 쿼리를 실행하고 데이터 세트가 반환됩니다 🎜🎜🎜 다음으로 thinkdbconnectorMysql의 쿼리 메서드가 나옵니다 🎜🎜 이 메서드는 주로 세 가지 작업을 수행합니다. 🎜
  • $this->initConnect初始化数据库连接$this->initConnect 初始化数据库连接
  • $this->PDOStatement->execute(); 执行查询
  • return $this->getResult($pdo, $procedure);
$this->PDOStatement ->execute(); 执行查询
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
return $this->getResult($pdo, $procedure); 返回结果集

执行查询 返回数据集

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
解析$this->in itConnect 初始化数据库连接

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

初始化数据库连接ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
这个配置项是에서 配置文件database中配置的,根据注释提供的信息可以看到主要是关于主从服务器设置的입니다.这里就不去解析框架是如何实现数据库主从配置了.

数据库부署方式:0 集中式(单一服务器),1 分布式(主从服务器)

🎜🎜俙个判断中에서 进行纆一次判断当前数据库连接的id,然后执行了连接数据库方法。🎜 🎜这个方法最终会返回object(PDO)#33의 一个实例信息。🎜
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
데이터베이스 연결 방법

$this - >PDOStatement->execute(); 쿼리 실행$this->PDOStatement->execute(); 执行查询

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

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
执行查询

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

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

第三件事情返回结果集

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

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

ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
获得数据集数组

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

두 번째로 해야 할 일은 쿼리를 실행하는 것입니다. 다음으로 이것이 어떻게 실행되는지 자세히 설명하겠습니다. 🎜🎜ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석🎜쿼리 실행 🎜🎜🎜pdo 인스턴스를 반환할 때 이 인스턴스를 🎜데이터 가져오기 배열을 설정하세요🎜🎜🎜최종 결과는 여기에 반환됩니다 __callStatic 메소드를 호출하여 상위 레이어의 $res 변수. 🎜
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
테스트 케이스
ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석
최종 쿼리 결과

지금까지 Db 쿼리를 이용한 실행 과정을 분석해 보았는데, 프레임워크로 캡슐화한 방법은 쿼리 뿐만 아니라 다른 쿼리 방법도 가능합니다. 다음: 프로세스가 단순 분석을 수행하고 있습니다.

최종 실행은 이 섹션의 마지막 몇 가지 프로세스이지만 이전 실행은 약간 다릅니다.

배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요

위 내용은 ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.