"드디어 프레임워크 분석이 끝났습니다. 이 글을 통해 프레임워크 내 모델과 뷰의 신비를 이해하게 될 것입니다.
"
일상의 개발 과정에서 모델을 사용하는 경우는 많지만, 개발 과정에서는 사용법만 알 뿐, 내부적으로 구현하는 방법은 모릅니다. 모델은 인터페이스나 인터페이스와 상관없이 사용되는 것입니다. 백엔드.
프런트엔드 뷰와 백엔드 뷰를 분리하는 일반적인 추세와 관련하여 프레임워크의 뷰 대부분은 여전히 백엔드 개발에 사용됩니다.
이 글도 프레임워크를 해석하는 마지막 단계입니다. 다음으로 Kaka는 프레임워크에서 Db 클래스의 신비를 모두가 배울 수 있도록 유도할 것입니다.
아래 사진은 카카에서 제공하는 뇌 지도를 바탕으로 기사를 읽어보실 수 있습니다.
모델을 배우기 전에 꼭 알아야 할 것은 데이터베이스를 운용하는 DB 클래스이다. .
프레임워크에는 이러한 구성 파일이 있으며, 이 구성 파일에는 데이터베이스 구성에 대한 일련의 정보가 있습니다.
다음 과정에서는 Kaka도 간단히 시연용 데이터베이스를 생성할 예정입니다.
프레임워크의 핵심 계층에도 두 개의 클래스, 즉 Db 클래스와 Model 클래스가 있습니다. 이 두 클래스는 다음 구문 분석 개체입니다.
Db 작업 클래스와 다른 클래스 간의 대응 관계를 분석하기 전에 먼저 데모용 데이터베이스를 생성합니다.
먼저 Db 클래스 정보를 살펴보겠습니다.
위 그림을 통해 Db 클래스의 일부 쿼리 메소드를 사용하는 Db 클래스에 대한 정보의 일부를 볼 수 있습니다.
하지만 Db 클래스의 마지막에는 익숙한 메서드 __callStatic
. __callStatic
。
这个方法在一直读咔咔文章的读者应该已经很是熟悉了,这个方法在门面源码解析那一节中进行过深入的了解。
对于这个方法只需要记住的是在调用没有声明的静态方法时会进行调用。
至于call_user_func_array
call_user_func_array
function can 이 메소드는 내장 함수이고 함수를 실행하기 위해 직접 호출할 수 있음, 즉 메소드를 직접 실행할 수 있음을 이해합니다. 🎜Db 클래스의 Annotation 정보만 보면, Db 클래스는 데이터베이스 연결 클래스인 Connection
이 클래스를 사용하고 있음을 알 수 있습니다.
이 클래스에 들어가서 간단히 생성자를 보면 실행 순서가 아래에 설명됩니다.
프레임워크에서 컨트롤러를 작동하는 데는 두 가지 주요 시나리오가 있습니다. 첫 번째는 Db 클래스 작업이고 두 번째는 모델 작업입니다.
Connection·은 커넥터, Query는 쿼리, Builder는 SQL 생성기,Exception은 예외 클래스입니다.
위의 정보를 알아두면 다음 이해 과정에서 도움이 될 것입니다. 다음 섹션에서는 Db 클래스 라이브러리 시나리오를 분석하겠습니다.
간단한 사례로 분석해 먼저 데이터베이스 데이터를 살펴보겠습니다.
그런 다음 컨트롤러로 이동하여 간단한 쿼리 케이스를 작성하고 컨트롤러를 만들기 전에 명령을 사용하여 테스트 컨트롤러를 만듭니다.
이 컨트롤러에서 간단한 쿼리 데이터를 수행합니다.
쿼리 결과는 다음과 같습니다
이 경우 Db::query
는 쿼리 메서드입니다. 다음으로 이 쿼리 메서드를 간략하게 분석하겠습니다. Db::query
这种查询方式,接下来对于这种查询方式进行简单的剖析。
接着执行流程就会来到Db这个类,在这个类中可以看到关于当对象访问不存在的静态方法时,__callStatic()方法会被自动调用。
这个方法在之前门面的讲解中进行了深度讲解。
从上图可以看到当执行访问对象不存在的静态方法时会执行到call_user_func_array调用回调函数,并把一个数组参数作为回调函数的参数
接着代码就会执行到static::connect()
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
这个字符串,这里一定要注意返回的是字符串,不是这个类的实例。
紧接着就会执行到第三步创建数据库连接对象实例,接下里将会对这一步进行解析。
紧接着会来到文件实际执行的为 new thinkdbQuery
,最终会返回执行查询 返回数据集,返回数据为返回 object(thinkdbQuery)
关于这个$this->connection
是在本类的构造函数进行设置的。
先简单的看一下这个构造函数,在这个构造函数中直接就设置了connection
Return object(thinkdbQuery)
🎜🎜이 정보$this->connection
이 이 클래스의 생성자에 설정됩니다. 🎜🎜이 생성자를 간략하게 살펴보겠습니다. 이 생성자에서는 connection
이 속성의 값이므로 위 그림에서 사용할 수 있습니다. 🎜여기서 실행이 완료된 후 반환된 값은 처음부터 파싱되었던 선언되지 않은 정적 메서드로 호출됩니다.
wherestatic::connect()
최종 반환 값입니다static::connect() 반환 개체(thinkdbQuery)
. static::connect()
就是最终返回的值static::connect() 返回 object(thinkdbQuery)
。
所以接下来代码会执行到 thinkphp/library/think/db/Query.php 的 query方法
$sql
정적 메서드
마지막 조각 코드 중 thinkdbconnectorMysql 쿼리 메서드가 실행됩니다
🎜 쿼리를 실행하고 데이터 세트가 반환됩니다 🎜🎜🎜 다음으로 thinkdbconnectorMysql의 쿼리 메서드가 나옵니다 🎜🎜 이 메서드는 주로 세 가지 작업을 수행합니다. 🎜$this->initConnect
初始化数据库连接$this->initConnect
初始化数据库连接$this->PDOStatement->execute();
执行查询return $this->getResult($pdo, $procedure);
$this->PDOStatement ->execute();
执行查询
执行查询 返回数据集
재这个方法中可以看到是进行了一次配置信息获取,首先需要明白这个配置信息是什么。
数据库부署方式:0 集中式(单一服务器),1 分布式(主从服务器)
🎜🎜俙个判断中에서 进行纆一次判断当前数据库连接的id,然后执行了连接数据库方法。🎜 🎜这个方法最终会返回object(PDO)#33의 一个实例信息。🎜$this - >PDOStatement->execute();
쿼리 실행$this->PDOStatement->execute();
执行查询
第二件事情做的就是执行查询,接下来我们来详细说明一下这个到底是如何执行的。
在返回pdo实例时,将这个实例赋值给了$this->PDOStatement
这个属性,所以会去PDO类中进行执行。
在这里大家需要明白一件事情就是关于execute这个方法,用于执行返回多个结果集、多个更新计数或二者组合的语句。
第三件事情返回结果集
直到这里就是执行的最后一步就是返回结果集。
这里使用的方法都是查询底层,就在去解析了,在这里就会返回最终查询结果。
最终结果就会返回给这里__callStatic
方法,并且返回给上层的$res
🎜데이터 가져오기 배열을 설정하세요🎜🎜🎜최종 결과는 여기에 반환됩니다 __callStatic
메소드를 호출하여 상위 레이어의 $res
변수. 🎜지금까지 Db 쿼리를 이용한 실행 과정을 분석해 보았는데, 프레임워크로 캡슐화한 방법은 쿼리 뿐만 아니라 다른 쿼리 방법도 가능합니다. 다음: 프로세스가 단순 분석을 수행하고 있습니다.
최종 실행은 이 섹션의 마지막 몇 가지 프로세스이지만 이전 실행은 약간 다릅니다.
“배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요
”
위 내용은 ThinkPHP 데이터베이스 쿼리 Db 클래스 시나리오 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!