前面的话

  ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着可以免费使用ThinkPHP,甚至允许把基于ThinkPHP开发的应用开源或商业产品发布/销售。ThinkPHP5.0版本是一个颠覆和重构版本,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有3.2项目的升级,但绝对是新项目的首选

目录结构

  thinkphp5安装完成后,初始目录结构如下所示

  1. www WEB部署目录(或者子目录)
  2. ├─application 应用目录
  3. ├─common 公共模块目录(可以更改)
  4. ├─module_name 模块目录
  5. ├─config.php 模块配置文件
  6. ├─common.php 模块函数文件
  7. ├─controller 控制器目录
  8. ├─model 模型目录
  9. ├─view 视图目录
  10. └─ ... 更多类库目录

  11. ├─command.php 命令行工具配置文件
  12. ├─common.php 公共函数文件
  13. ├─config.php 公共配置文件
  14. ├─route.php 路由配置文件
  15. ├─tags.php 应用行为扩展定义文件
  16. └─database.php 数据库配置文件

  17. ├─public WEB目录(对外访问目录)
  18. ├─index.php 入口文件
  19. ├─router.php 快速测试文件
  20. └─.htaccess 用于apache的重写

  21. ├─thinkphp 框架系统目录
  22. ├─lang 语言文件目录
  23. ├─library 框架类库目录
  24. ├─think Think类库包目录
  25. └─traits 系统Trait目录

  26. ├─tpl 系统模板目录
  27. ├─base.php 基础定义文件
  28. ├─console.php 控制台入口文件
  29. ├─convention.php 框架惯例配置文件
  30. ├─helper.php 助手函数文件
  31. ├─phpunit.xml phpunit配置文件
  32. └─start.php 框架入口文件

  33. ├─extend 扩展类库目录
  34. ├─runtime 应用的运行时目录(可写,可定制)
  35. ├─vendor 第三方类库目录(Composer依赖库)
  36. ├─build.php 自动生成定义文件(参考)
  37. ├─composer.json composer 定义文件
  38. ├─LICENSE.txt 授权说明文件
  39. ├─README.md README 文件
  40. ├─think 命令行入口文件

开发规范

【目录和文件】

  1、目录不强制规范,驼峰和小写+下划线模式均支持

  2、类库、函数文件统一以.php为后缀

  3、类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致

  4、类名和类文件名保持一致,统一采用驼峰法命名(首字母大写)

【函数和类、属性命名】

  1、类的命名采用驼峰法,并且首字母大写,例如 UserUserType,默认不需要添加后缀,例如UserController应该直接命名为User

  2、函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip

  3、方法的命名使用驼峰法,并且首字母小写,例如 getUserName

  4、属性的命名使用驼峰法,并且首字母小写,例如 tableNameinstance

  5、以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload

【常量和配置】

  1、常量以大写字母和下划线命名,例如 APP_PATH和 THINK_PATH

  2、配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert

【数据表和字段】

  1、数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名

常见概念

  ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织。下面是一些常见概念

【入口文件】

  用户请求的PHP文件,负责处理一个请求(注意,不一定是URL请求)的生命周期,最常见的入口文件就是index.php,有时候也会为了某些特殊的需求而增加新的入口文件,例如给后台模块单独设置的一个入口文件admin.php或者一个控制器程序入口think都属于入口文件

【应用】

  应用在ThinkPHP中是一个管理系统架构及生命周期的对象,由系统的 \think\App类完成,应用通常在入口文件中被调用和执行,具有相同的应用目录(APP_PATH)的应用我们认为是同一个应用,但一个应用可能存在多个入口文件。应用具有自己独立的配置文件、公共(函数)文件

【模块】

  一个典型的应用是由多个模块组成的,这些模块通常都是应用目录下面的一个子目录,每个模块都有自己独立的配置文件、公共文件和类库文件

【控制器】

  每个模块拥有独立的MVC类库及配置文件,一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。

  控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理

  一个典型的Index控制器类如下:

  1. namespace app\index\controller;
  2. class Index
  3. {
  4. public function index()
  5. {
  6. return 'hello,thinkphp!';
  7. }
  8. }

【操作】

  一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。

  下面是一个典型的Index控制器的操作方法定义,包含了两个操作方法:

  1. namespace app\index\controller;
  2. class Index
  3. {
  4. public function index()
  5. {
  6. return 'index';
  7. }
  8. public function hello($name)
  9. {
  10. return 'Hello,'.$name;
  11. }
  12. }

  操作方法可以不使用任何参数,如果定义了一个非可选参数,则该参数必须通过用户请求传入,如果是URL请求,则通常是$_GET或者$_POST方式传入

【模型】

  模型类通常完成实际的业务逻辑和数据封装,并返回和格式无关的数据

【视图】

  控制器调用模型类后返回的数据通过视图组装成不同格式的输出。视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。

  视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录

【驱动】

  系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入核心类库目录下面,也可以重新定义驱动类库的命名空间而改变驱动的文件位置

【行为】

  行为(Behavior)是在预先定义好的一个应用位置执行的一些操作。类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。所以,行为通常是和某个位置相关,行为的执行时间依赖于绑定到了哪个位置上。

  要执行行为,首先要在应用程序中进行行为侦听,例如:

  1. // 在app_init位置侦听行为
  2. \think\Hook::listen('app_init');

  然后对某个位置进行行为绑定:

  1. // 绑定行为到app_init位置
  2. \think\Hook::add('app_init','\app\index\behavior\Test');

  一个位置上如果绑定了多个行为的,按照绑定的顺序依次执行,除非遇到中断

【命名空间】

  ThinkPHP5采用了PHP的命名空间进行类库文件的设计和规划,并且符合PSR-4的自动加载规范、

入口文件

  ThinkPHP5.0版本的默认自带的入口文件位于public/index.php(实际部署的时候public目录为应用对外访问目录),入口文件内容如下:

  1. // 定义应用目录
  2. define('APP_PATH', __DIR__ . '/../application/');
  3. // 加载框架引导文件
  4. require __DIR__ . '/../thinkphp/start.php';

  这段代码的作用就是定义应用目录APP_PATH和加载ThinkPHP框架的入口文件,这是所有基于ThinkPHP开发应用的第一步

  官方提供的默认应用的实际目录结构和说明如下:

  1. ├─application 应用目录(可设置)
  2. ├─index 模块目录(可更改)
  3. ├─config.php 模块配置文件
  4. ├─common.php 模块公共文件
  5. ├─controller 控制器目录
  6. ├─model 模型目录
  7. └─view 视图目录

  8. ├─command.php 命令行工具配置文件
  9. ├─common.php 应用公共文件
  10. ├─config.php 应用配置文件
  11. ├─tags.php 应用行为扩展定义文件
  12. ├─database.php 数据库配置文件
  13. └─route.php 路由配置文件

  5.0版本采用模块化的设计架构,默认的应用目录下面只有一个index模块目录,如果要添加新的模块可以使用控制台命令来生成。

  切换到命令行模式下,进入到应用根目录并执行如下指令:

  1. php think build --module demo

  就会生成一个默认的demo模块,包括如下目录结构:

  1. ├─demo
  2. ├─controller 控制器目录
  3. ├─model 模型目录
  4. ├─view 视图目录
  5. ├─config.php 模块配置文件
  6. └─common.php 模块公共文件

  同时也会生成一个默认的Index控制器文件

资源访问

  网站的资源文件访问不会影响正常的操作访问,只有当访问的资源文件不存在的时候才会解析到入口文件,一般就会提示模块不存在的错误。

  网站的资源文件一般放入public目录的子目录下面,例如下面是一个建议规范:

  1. public
  2. ├─index.php 应用入口文件
  3. ├─static 静态资源目录
  4. ├─css 样式目录
  5. ├─js 脚本目录
  6. └─img 图像目录

  访问资源文件的URL路径是:

  1. http://tp5.com/static/css/style.css
  2. http://tp5.com/static/js/common.js
  3. http://tp5.com/static/img/picture.jpg

  如果没有设置域名绑定,而是使用子目录方式访问的话,那么可能的资源访问地址是:

  1. http://localhost/public/static/css/style.css
  2. http://localhost/public/static/js/common.js
  3. http://localhost/public/static/img/picture.jpg

调试模式

  ThinkPHP支持调试模式,默认情况下是开启状态(5.0.10+版本开始,默认关闭调试模式,需要自己开启)。调试模式以除错方便优先,而且在异常的时候可以显示尽可能多的信息,所以对性能有一定的影响。

  强烈建议开发者在使用ThinkPHP开发的过程中使用调试模式,5.0默认情况下可以捕获到任何细微的错误并抛出异常,这样可以更好的获取错误提示和避免一些问题和隐患,不要畏惧错误,要勇敢面对,并消除隐患。

  开发完成后,实际进行项目部署的时候,修改应用配置文件(application/config.php)中的app_debug配置参数:

  1. // 关闭调试模式
  2. 'app_debug' => false,

控制器

  找到index模块的Index控制器(文件位于application/index/controller/Index.php 注意大小写),把Index控制器类的index方法修改为Hello,World!

  1. <?php
  2. namespace app\index\controller;
  3. class Index
  4. {
  5. public function index()
  6. {
  7. return 'Hello,World!';
  8. }
  9. }

  访问URL地址时,就会看到Hello,World!的输出结果

  如果要访问一个驼峰命名的控制器,例如我们把上面的例子改成一个HelloWorld控制器

  1. <?php
  2. namespace app\index\controller;
  3. class HelloWorld
  4. {
  5. public function index($name = 'World')
  6. {
  7. return 'Hello,' . $name . '!';
  8. }
  9. }

  默认情况下正确的方法是使用下面的URL进行访问

  1. http://tp5.com/index.php/index/hello_world

  下面的访问地址是错误的

  1. http://tp5.com/index.php/index/HelloWorld

  因为默认的URL访问是不区分大小写的,全部都会转换为小写的控制器名,除非在应用配置文件中,设置了关闭url自动转换如下:

  1. 'url_convert' => false,

  那么就可以正常访问

  1. http://tp5.com/index.php/index/HelloWorld

  如果要继承一个公共的控制器类,可以使用:

  1. <?php
  2.  
  3. namespace app\index\controller;
  4.  
  5. use app\index\controller\Base;
  6.  
  7. class Index extends Base
  8. {
  9. public function index()
  10. {
  11. return 'Hello,World!';
  12. }
  13. }

  可以为操作方法定义参数,例如:

  1. <?php
  2.  
  3. namespace app\index\controller;
  4.  
  5. class Index
  6. {
  7. public function index($name = 'World')
  8. {
  9. return 'Hello,' . $name . '!';
  10. }
  11. }

  当带name参数访问入口文件地址(例如 http://tp5.com?name=ThinkPHP)的时候,在浏览器中可以看到如下输出:

  1. Hello,ThinkPHP

  控制器类可以包括多个操作方法,但如果操作方法是protected或者private类型的话,是无法直接通过URL访问到该操作的,也就是说只有public类型的操作方法才是可以通过URL访问的。

  下面来验证下,把Index控制器类的方法修改为:

  1. <?php
  2. namespace app\index\controller;
  3.  
  4. class Index
  5. {
  6. public function hello()
  7. {
  8. return 'hello,thinkphp!';
  9. }
  10.  
  11. public function test()
  12. {
  13. return '这是一个测试方法!';
  14. }
  15.  
  16. protected function hello2()
  17. {
  18. return '只是protected方法!';
  19. }
  20.  
  21. private function hello3()
  22. {
  23. return '这是private方法!';
  24. }
  25. }

  当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常

  1. http://tp5.com/index.php/index/index/hello
  2. http://tp5.com/index.php/index/index/test
  3. http://tp5.com/index.php/index/index/hello2
  4. http://tp5.com/index.php/index/index/hello3

视图

  现在我们在给控制器添加视图文件功能,我们在application/index目录下面创建一个view目录,然后添加模板文件view/index/hello.html(注意大小写),我们添加模板内容如下:

  1. <html>
  2. <head>
  3. <title>hello {$name}</title>
  4. </head>
  5. <body>
  6. hello, {$name}!
  7. </body>
  8. </html>

  要输出视图,必须在控制器方法中进行模板渲染输出操作,现在修改控制器类如下:

  1. <?php
  2. namespace app\index\controller;
  3.  
  4. use think\Controller;
  5.  
  6. class Index extends Controller
  7. {
  8. public function hello($name = 'thinkphp')
  9. {
  10. $this->assign('name', $name);
  11. return $this->fetch();
  12. }
  13. }

  [注意]如果没有使用use think\Controller;就必须使用class Index extends \think\Controller

  Index控制器类继承了 think\Controller类之后,我们可以直接使用封装好的assignfetch方法进行模板变量赋值和渲染输出。

  fetch方法中我们没有指定任何模板,所以按照系统默认的规则(视图目录/控制器/操作方法)输出了view/index/hello.html模板文件。

  接下来,我们在浏览器访问

  1. http://tp5.com/index.php/index/index/hello

  输出:

  1. hello,thinkphp!

读取数据

  在开始之前,我们首先在数据库demo中创建一个think_data数据表(这里以mysql数据库为例):

  1. CREATE TABLE IF NOT EXISTS `think_data`(
  2. `id` int() unsigned NOT NULL AUTO_INCREMENT,
  3. `data` varchar() NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
  6.  
  7. INSERT INTO `think_data`(`id`,`data`) VALUES
  8. (,'thinkphp'),
  9. (,'php'),
  10. (,'framework');

  首先我们需要在应用的数据库配置文件application/database.php中添加数据库的连接信息如下:

  1. return [
  2. // 数据库类型
  3. 'type' => 'mysql',
  4. // 服务器地址
  5. 'hostname' => '127.0.0.1',
  6. // 数据库名
  7. 'database' => 'demo',
  8. // 数据库用户名
  9. 'username' => 'root',
  10. // 数据库密码
  11. 'password' => '',
  12. // 数据库连接端口
  13. 'hostport' => '',
  14. // 数据库连接参数
  15. 'params' => [],
  16. // 数据库编码默认采用utf8
  17. 'charset' => 'utf8',
  18. // 数据库表前缀
  19. 'prefix' => 'think_',
  20. // 数据库调试模式
  21. 'debug' => true,
  22. ];

  接下来,我们修改下控制器方法,添加读取数据的代码:

  1. <?php
  2. namespace app\index\controller;
  3.  
  4. use think\Controller;
  5. use think\Db;
  6.  
  7. class Index extends Controller
  8. {
  9. public function index()
  10. {
  11. $data = Db::name('data')->find();
  12. $this->assign('result', $data);
  13. return $this->fetch();
  14. }
  15. }

  定义好控制器后,我们修改模板文件,添加数据输出标签如下:

  1. <html>
  2. <head>
  3. <title></title>
  4. </head>
  5. <body>
  6. {$result.id}--{$result.data}
  7. </body>
  8. </html>

  模板标签的用法和Smarty类似,就是用于输出数据的字段,这里就表示输出think_data表的iddata字段的值。

  我们访问会输出:

  1. --thinkphp

thinkphp5基础的更多相关文章

  1. ThinkPHP5 基础知识入门 [入门必先了解]

    一.目录结构 下载最新版框架后,解压缩到web目录下面,可以看到初始的目录结构如下: project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录( ...

  2. ThinkPHP5基础学习(慕课版)

    一.thinkphp 5.0 的安装及配置 二.URL和路由 三.请求和相应 四.视图和模板 五.数据库的操作 六.模型的操作

  3. ThinkPHP5基础学习

    一.目录与文件结构 二.控制器 三.数据库 四.模型 五.模板

  4. 开源微信小程序商城测评

    1. Java版 1)微同商城 减少重复造轮子,开源微信小程序商城 .快速搭建一个属于自己的微信小程序商城. 官网地址:https://fly2you.cn 开源地址:https://gitee.co ...

  5. redis+thinkphp5的注册、登陆、关注基础例子

    最近初步接触redis,结合thinkphp5与redis,写了一个用户注册的基础例子,用于学习. 这个例子是结合了兄弟连的redis视频,最后两节的内容写的:https://study.163.co ...

  6. thinkPHP5.0的学习研究【基础】

    2017年6月19日13:25:56 基础:1.ThinkPHP5的环境要求如下: PHP >= 5.4.0        PDO PHP Extension        MBstring P ...

  7. ThinkPHP5从零基础搭建CMS系统(一)

    了解学习thinkphp5应该是2016年年底的事情,当时还没有接触过thinkphp3版本,觉得通过手册直接上手学习tp5蛮轻松的,现在从零记录下,搭建可扩展的CMS. 1.ThinkPHP环境搭建 ...

  8. ThinkPHP5零基础搭建CMS系统(一)

    了解学习thinkphp5应该是2016年年底的事情,当时还没有接触过thinkphp3版本,觉得通过手册直接上手学习tp5蛮轻松的,现在从零记录下,搭建可扩展的CMS. 1.ThinkPHP环境搭建 ...

  9. ThinkPHP5从零基础搭建CMS系统(二)

    接上节,开启wamp集成环境,在浏览器地址栏输入http://localhost/cms/public,即可运行项目,但是这边域名太长,做一下处理. 注:需要查看tp5全部教程,请点击右侧thinkp ...

随机推荐

  1. Virtual

    Virtual 作用: 允许在派生类中重新定义与基类同名函数并且可以通过其类的指针或引用来访问基类何派生类的同名函数. 1. 概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少 ...

  2. 在微信端使用video标签,播放结束会出现QQ浏览器推荐视频的解决办法(vue)

    会出现播放结束显示QQ浏览器推荐视频的原因:(我是vue的项目,而且我是新手,只是单纯的给大家分享一个方法,代码比较low请自动忽略) 因为在x5(QQ浏览器)内核中,把video标签劫持了,只要是检 ...

  3. 最基本的mysql

    SQL 连接数据库 mysql -u root -p 备份数据库 mysql -u root -p 要备份数据库名>文件位置和文件名 恢复数据库 方式1 mysql -u root -p DBN ...

  4. python 实用案例 supervisord管理进程详解

    Supervisor是由python语言编写,基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能.Supervisor类似于monit,monit ...

  5. 从cdn说起

    为什么要使用cdn 雅虎军规有一条规则建议我们是用cdn.随便在网上搜索,可以找到使用的cdn的好处. 再次强调第一条黄金定律,减少网页内容的下载时间.提高下载速度还可以通过CDN(内容分发网络)来提 ...

  6. mybatis简单搭建

    背景 闲来没事把mybatis再熟悉一下,可能之前自己搭过没有记录.mybatis其实就是一个orm框架,在我们之前做.net工作的时候,我们的ef,dapper等都是这样的框架,java现在web流 ...

  7. redis数据类型及常用命令介绍(图文实例)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhgAAAFLCAYAAACUdvXUAAAgAElEQVR4nO3da1da58L2fT5KfPvc96 ...

  8. 关于如何获取移动端 touchmove 事件中真正触摸点下方的元素

    移动端的touchstart, touchmove, touchend三个事件,点击元素并拖动时,获取到了touchmove事件, 但是event.touches[0].target所指向的元素却是t ...

  9. 【转】如何使用Git上传本地项目到github?(mac版)

    原文链接:http://www.cnblogs.com/lijiayi/p/pushtogithub.html 在此假设你已经在 github 上创建好了一个项目,像这样: 并且你已经完成了自己的项目 ...

  10. .NET作品集:linux下的博客程序

    博客程序架构 本博客程序是博主11年的时候参考loachs小泥鳅博客内核开发的.net跨平台博客cms,距今已有6年多了,个人博客网站一直在用,虽然没有wordpress那么强大,但是当时在深究.ne ...