简介
ThinkPHP
是一个快速、简单的基于MVC
和面向对象的轻量级PHP
开发框架,遵循Apache2
开源协议发布,自2006年诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,尤其注重开发体验和易用性,并且拥有众多的原创功能和特性,为WEB
应用和API
开发提供了强有力的支持。
相当于以往版本,
ThinkPHP5.0
版本是一个颠覆和重构版本,也是ThinkPHP
十周年献礼版本,基于PHP5.4
设计(完美支持PHP7
),采用全新的架构思想,引入了很多的PHP
新特性,优化了核心,减少了依赖,支持Composer
,实现了真正的惰性加载,并且为API
开发做了深入的支持,在功能、性能以及灵活性方面都较为突出。
安装
ThinkPHP提供多个方式的安装,包括官网下载、Composer
安装以及GIT
下载。
对于新手来说,有必要理解这几种安装方式的区别:官网下载是一般都是稳定版本(并不会实时更新),有些大的版本还会提供核心版(不含扩展)和完整版(包含常用扩展)两个版本;Composer
安装的学问比较多,但是一种主流的安装方式,Composer
也分为稳定版和开发版安装,如果是安装的稳定版则可以update
到最新的稳定版,如果是安装的开发版那么update
到的也是实时的开发版,安装慢的可以使用国内镜像,但注意存在一定的缓存时间;GIT
安装是直接通过git
地址安装的方式,优势是可以实时更新,跟着官方开发版本走的用户可以选择GIT
更新,也方便及时反馈和提交PR
,除了Github
之外,国内的码云和Coding
代码托管平台都有ThinkPHP5的镜像,请自行选择。
官网下载
ThinkPHP最新的稳定版本可以在(官方网站下载页)下载,不过官网下载版本并不是实时更新的,我们会在每个版本更新发布的时候重新打包,如果你需要实时更新版本,请使用Git
版本库或者Composer
安装。
Composer安装和更新
ThinkPHP5.0
支持使用Composer
安装和更新,如果还没有安装 Composer
,你可以按 Composer安装 中的方法安装。在 Linux
和 Mac OS X
中可以运行如下命令:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
在 Windows
中,你需要下载并运行 Composer-Setup.exe。
提示:
如果遇到任何问题或者想更深入地学习 Composer,请参考 Composer 官方文档(英文),看云上有 Composer 的中文版本。
如果你已经安装有 Composer
请确保使用的是最新版本,或者可以用 composer self-update
命令更新为最新版本。
由于众所周知的原因,国外的网站连接速度很慢,并且随时可能被“墙”甚至“不存在”。因此安装的时间可能会比较长,我们建议通过下面的方式使用国内镜像。
打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
然后在命令行下面,切换到你的web根目录下面并执行下面的命令:
composer create-project topthink/think tp5 --prefer-dist
如果出现错误提示,请根据提示操作或者参考Composer中文文档。
如果之前使用Composer
安装的话,首先切换到你的tp5
目录,然后使用下面的命令更新框架到最新版本(注意因为缓存关系,composer
不一定是及时更新的):
composer update
注意:
使用composer update更新核心框架会清空原来的核心框架目录,如果你定制了核心框架或者添加了扩展在核心目录的话,建议使用后面的Git方式更新。
Git下载和更新
ThinkPHP
使用Git
版本库进行更新迭代,如果你不太了解Composer
或者觉得Composer
太慢,也可以使用git
版本库安装和更新,ThinkPHP5.0
拆分为多个仓库,下面是github
(主要维护仓库)及国内的仓库地址:
[ Github ]
- 应用项目:
https://github.com/top-think/think
- 核心框架:
https://github.com/top-think/framework
[ 码云 ]
- 应用项目:
https://git.oschina.net/liu21st/thinkphp5.git
- 核心框架:
https://git.oschina.net/liu21st/framework.git
[ Coding ]
- 应用项目:
https://git.coding.net/liu21st/thinkphp5.git
- 核心框架:
https://git.coding.net/liu21st/framework.git
提示:
之所以设计为应用和核心仓库分离,是为了支持
Composer
单独更新核心框架。
如果你还没安装Git
,可以参考阅读 Pro Git第二版(中文)先。
首先克隆下载应用项目仓库
git clone https://github.com/top-think/think tp5
然后切换到tp5
目录下面,再克隆核心框架仓库:
git clone https://github.com/top-think/framework thinkphp
两个仓库克隆完成后,就完成了ThinkPHP5.0
的Git
方式下载,如果需要更新核心框架的时候,只需要切换到thinkphp核心目录下面,然后执行:
git pull https://github.com/top-think/framework
如果不熟悉git
命令行,可以使用任何一个GIT
客户端进行操作,在此不再详细说明。
Github上还给新手提供了包含了常用扩展的完整版,可以免去composer安装的烦恼,下载地址:https://github.com/top-think/think/tree/archive
GIT方式只能安装核心框架,官方扩展只能通过Composer
安装。
目录结构
Composer
安装后(或者下载后的压缩文件解压后)可以看到下面的目录结构:
tp5
├─application 应用目录
├─extend 扩展类库目录(可定义)
├─public 网站对外访问目录
├─runtime 运行时目录(可定义)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架核心目录
├─build.php 自动生成定义文件(参考)
├─composer.json Composer定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行工具入口
注意:
如果在linux环境下面的话,需要给
runtime
目录755
权限。
有几个关键的路径先了解下:
目录 | 说明 | 常量 |
---|---|---|
tp5 | 项目根目录 | ROOT_PATH |
tp5/application | 应用目录 | APP_PATH |
tp5/thinkphp | 框架核心目录 | THINK_PATH |
tp5/extend | 应用扩展目录 | EXTEND_PATH |
tp5/vendor | Composer扩展目录 | VENDOR_PATH |
核心框架目录的结构如下:
├─thinkphp 框架系统目录
│ ├─lang 语言包目录
│ ├─library 框架核心类库目录
│ │ ├─think think 类库包目录
│ │ └─traits 系统 traits 目录
│ ├─tpl 系统模板目录
│ │
│ ├─.htaccess 用于 apache 的重写
│ ├─.travis.yml CI 定义文件
│ ├─base.php 框架基础文件
│ ├─composer.json composer 定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 惯例配置文件
│ ├─helper.php 助手函数文件(可选)
│ ├─LICENSE.txt 授权说明文件
│ ├─phpunit.xml 单元测试配置文件
│ ├─README.md README 文件
│ └─start.php 框架引导文件
运行环境
ThinkPHP5的环境要求如下:
- PHP >= 5.4.0 (完美支持PHP7)
- PDO PHP Extension
- MBstring PHP Extension
- CURL PHP Extension
在开始之前,你需要一个Web
服务器和PHP5.4+
运行环境,如果你暂时还没有,我们推荐使用集成开发环境WAMPServer(Windows系统下集成Apache、PHP和MySQL的服务套件)来使用ThinkPHP
进行本地开发和测试,最新版本的WAMP在这里下载。
如果你不想安装任何WEB
服务器,也可以直接使用PHP自带的WebServer
,并且运行router.php
来运行测试。
我们进入命令行,进入tp5/public
目录后,输入如下命令:
php -S localhost:8888 router.php
如果提示错误,请检查你的
php.exe
所在路径是否已经加入系统环境变量Path
。
接下来可以直接访问
http://localhost:8888
注意: S 一定要大写,端口号可以随意设置,只要和已有的不冲突,如果要停止服务,直接在命令行下面按
CTRL+C
即可退出。
入口文件
ThinkPHP5.0
版本的默认自带的入口文件位于public/index.php
(实际部署的时候public
目录为你的应用对外访问目录),入口文件内容如下:
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
这段代码的作用就是定义应用目录APP_PATH
和加载ThinkPHP
框架的入口文件,这是所有基于ThinkPHP
开发应用的第一步。
我们可以在浏览器中访问入口文件
http://localhost/tp5/public/
运行后我们会看到欢迎页面:
官方提供的默认应用的实际目录结构和说明如下:
├─application 应用目录(可设置)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块公共文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ └─view 视图目录
│ │
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共文件
│ ├─config.php 应用配置文件
│ ├─tags.php 应用行为扩展定义文件
│ ├─database.php 数据库配置文件
│ └─route.php 路由配置文件
5.0
版本采用模块化的设计架构,默认的应用目录下面只有一个index
模块目录,如果我要添加新的模块可以使用控制台命令来生成。
切换到命令行模式下,进入到应用根目录并执行如下指令:
php think build --module demo
就会生成一个默认的demo模块,包括如下目录结构:
├─demo
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─view 视图目录
│ ├─config.php 模块配置文件
│ └─common.php 模块公共文件
同时也会生成一个默认的Index
控制器文件。
注意:这只是一个初始默认的目录结构,在实际的开发过程中可能需要创建更多的目录和文件。
在后面的示例中,为了方便访问,我们设置vhost
访问,以apache
为例的话定义如下:
<VirtualHost *:80>
DocumentRoot "/home/www/tp5/public"
ServerName tp5.com
</VirtualHost>
把
DocumentRoot
修改为你本机tp5/public
所在目录,并注意修改本机的hosts
文件把tp5.com
指向本地127.0.0.1
。
如果你暂时不想设置vhost
或者还不是特别了解如何设置,可以先把入口文件移动到框架的ROOT_PATH
目录,并更改入口文件中的APP_PATH
和框架入口文件的位置(这里顺便展示下如何更改相关目录名称),index.php
文件内容如下:
// 定义应用目录为apps
define('APP_PATH', __DIR__ . '/apps/');
// 加载框架引导文件
require __DIR__ . '/think/start.php';
这样最终的应用目录结构如下:
tp5
├─index.php 应用入口文件
├─apps 应用目录
├─public 资源文件目录
├─runtime 运行时目录
└─think 框架目录
实际的访问URL变成了
http://localhost/tp5/
提示:
如非特别说明,我们后面的示例均以
tp5.com
进行访问,如果你使用了其它的方式请自行修改。
资源访问
网站的资源文件访问不会影响正常的操作访问,只有当访问的资源文件不存在的时候才会解析到入口文件,一般就会提示模块不存在的错误。
网站的资源文件一般放入public
目录的子目录下面,例如下面是一个建议规范:
public
├─index.php 应用入口文件
├─static 静态资源目录
│ ├─css 样式目录
│ ├─js 脚本目录
│ └─img 图像目录
记住,千万不要在
public
目录之外的任何位置放置资源文件,包括application
目录。
访问资源文件的URL路径是:
http://tp5.com/static/css/style.css
http://tp5.com/static/js/common.js
http://tp5.com/static/img/picture.jpg
如果你没有设置域名绑定,而是使用子目录方式访问的话,那么可能的资源访问地址是:
http://localhost/public/static/css/style.css
http://localhost/public/static/js/common.js
http://localhost/public/static/img/picture.jpg
网站的入口文件就是资源文件的起始位置,如果你的入口文件不是在
public
目录下面的话,还需要自行调整。
如果不清楚当前的入口文件位置,可以使用phpinfo()
在页面输出中查看DOCUMENT_ROOT
的值。
调试模式
ThinkPHP
支持调试模式,默认情况下是开启状态。调试模式以除错方便优先,而且在异常的时候可以显示尽可能多的信息,所以对性能有一定的影响。
我们强烈建议开发者在使用ThinkPHP
开发的过程中使用调试模式,5.0
默认情况下可以捕获到任何细微的错误并抛出异常,这样可以更好的获取错误提示和避免一些问题和隐患,不要畏惧错误,要勇敢面对,并消除隐患。
开发完成后,我们实际进行项目部署的时候,修改应用配置文件(application/config.php
)中的app_debug
配置参数:
// 关闭调试模式
'app_debug' => false,
为了安全考虑,避免泄露你的服务器WEB目录信息等资料,一定记得正式部署的时候关闭调试模式。
控制器
我们找到index
模块的Index
控制器(文件位于application/index/controller/Index.php
注意大小写),我们把Index
控制器类的index
方法修改为Hello,World!
。
<?php
namespace app\index\controller;
class Index
{
public function index()
{
return 'Hello,World!';
}
}
提示:
根据类的命名空间可以快速定位文件位置,在
ThinkPHP5.0
的规范里面,命名空间其实对应了文件的所在目录,app
命名空间通常代表了文件的起始目录为application
,而think
命名空间则代表了文件的起始目录为thinkphp/library/think
,后面的命名空间则表示从起始目录开始的子目录。
我们访问URL地址
http://tp5.com
就会看到Hello,World!
的输出结果。
如果要访问一个驼峰命名的控制器,例如我们把上面的例子改成一个HelloWorld
控制器。
<?php
namespace app\index\controller;
class HelloWorld
{
public function index($name = 'World')
{
return 'Hello,' . $name . '!';
}
}
默认情况下正确的方法是使用下面的URL进行访问
http://tp5.com/index.php/index/hello_world
下面的访问地址是错误的
http://tp5.com/index.php/index/HelloWorld
因为默认的URL访问是不区分大小写的,全部都会转换为小写的控制器名,除非你在应用配置文件中,设置了关闭url自动转换如下:
'url_convert' => false,
那么就可以正常访问
http://tp5.com/index.php/index/HelloWorld
如果要继承一个公共的控制器类,可以使用:
<?php
namespace app\index\controller;
use app\index\controller\Base;
class Index extends Base
{
public function index()
{
return 'Hello,World!';
}
}
可以为操作方法定义参数,例如:
<?php
namespace app\index\controller;
class Index
{
public function index($name = 'World')
{
return 'Hello,' . $name . '!';
}
}
当我们带name
参数访问入口文件地址(例如 http://tp5.com?name=ThinkPHP
)的时候,在浏览器中可以看到如下输出:
Hello,ThinkPHP!
控制器类可以包括多个操作方法,但如果你的操作方法是protected
或者private
类型的话,是无法直接通过URL访问到该操作的,也就是说只有public
类型的操作方法才是可以通过URL访问的。
我们来验证下,把Index
控制器类的方法修改为:
<?php
namespace app\index\controller;
class Index
{
public function hello()
{
return 'hello,thinkphp!';
}
public function test()
{
return '这是一个测试方法!';
}
protected function hello2()
{
return '只是protected方法!';
}
private function hello3()
{
return '这是private方法!';
}
}
当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常。
http://tp5.com/index.php/index/index/hello
http://tp5.com/index.php/index/index/test
http://tp5.com/index.php/index/index/hello2
http://tp5.com/index.php/index/index/hello3
当我们访问hello2
和hello3
操作方法后的结果都会显示类似的异常信息:
异常页面包含了详细的错误信息,是因为开启了调试模式,如果关闭调试模式的话,看到的默认信息如下:
视图
现在我们在给控制器添加视图文件功能,我们在application/index
目录下面创建一个view
目录,然后添加模板文件view/index/hello.html
(注意大小写),我们添加模板内容如下:
<html>
<head>
<title>hello {$name}</title>
</head>
<body>
hello, {$name}!
</body>
</html>
要输出视图,必须在控制器方法中进行模板渲染输出操作,现在修改控制器类如下:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function hello($name = 'thinkphp')
{
$this->assign('name', $name);
return $this->fetch();
}
}
[ 新手须知 ]
这里使用了
use
来导入一个命名空间的类库,然后可以在当前文件中直接使用该别名而不需要使用完整的命名空间路径访问类库。也就说,如果没有使用
use think\Controller;
就必须使用
class Index extends \think\Controller
这种完整命名空间方式。
在后面的内容中,如果我们直接调用系统的某个类的话,都会假设已经在类的开头使用
use
进行了别名导入。
注意,Index
控制器类继承了 think\Controller
类之后,我们可以直接使用封装好的assign
和fetch
方法进行模板变量赋值和渲染输出。
fetch
方法中我们没有指定任何模板,所以按照系统默认的规则(视图目录/控制器/操作方法)输出了view/index/hello.html
模板文件。
接下来,我们在浏览器访问
http://tp5.com/index.php/index/index/hello
输出:
hello,thinkphp!
读取数据
在开始之前,我们首先在数据库demo
中创建一个think_data
数据表(这里以mysql
数据库为例):
CREATE TABLE IF NOT EXISTS `think_data`(
`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
`data` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
INSERT INTO `think_data`(`id`,`data`) VALUES
(1,'thinkphp'),
(2,'php'),
(3,'framework');
首先我们需要在应用的数据库配置文件application/database.php
中添加数据库的连接信息如下:
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'demo',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => true,
];
接下来,我们修改下控制器方法,添加读取数据的代码:
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Index extends Controller
{
public function index()
{
$data = Db::name('data')->find();
$this->assign('result', $data);
return $this->fetch();
}
}
定义好控制器后,我们修改模板文件,添加数据输出标签如下:
<html>
<head>
<title></title>
</head>
<body>
{$result.id}--{$result.data}
</body>
</html>
模板标签的用法和Smarty
类似,就是用于输出数据的字段,这里就表示输出think_data
表的id
和data
字段的值。
我们访问会输出:
1--thinkphp
总结
本章我们学习了如何安装ThinkPHP
和框架的目录结构,如何创建项目的入口文件和开启调试模式,并通过一个Hello,Name
例子说明了如何定义控制器和模板,以及如何读取数据库的数据并在模板渲染输出。