资源描述
第4章 ThinkPHP框架
4
11
第
第
章
章导读
ThinkPHP框架
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业级应用开发而诞生的。
ThinkPHP借鉴国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,采用单一入口模式等,融合了Struts的Action思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作,在项目配置、类库导入、模版引擎、查询语言、自动验证、视图模型、项目编译、缓存机制、SEO支持、分布式数据库、多数据库连接和切换、认证机制和扩展性方面均有独特的表现。通过本章的学习,读者将对ThinkPHP框架有深入的认识,并且能够达到简单应用的程度。
: ThinkPHP项目创建流程
: ThinkPHP项目目录结构、部署方案、命名规范和构建流程
: ThinkPHP的配置
: ThinkPHP的控制器
: ThinkPHP的模型,模型的命名、实例化、属性访问
: ThinkPHP的模型,连接数据库、创建数据、连贯操作以及CURD操作
: ThinkPHP的视图
: ThinkPHP的内置模板引擎
4.1 ThinkPHP简介
ThinkPHP可以更方便和快捷的开发和部署应用。其不仅仅是企业级应用,任何PHP应用开发都可以从ThinkPHP的简单和快速的特性中受益。ThinkPHP本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念,用最少的代码完成更多的功能,宗旨就是让Web应用开发更简单、更快速。
ThinkPHP遵循Apache2开源许可协议发布,意味着可以免费使用ThinkPHP,甚至允许把基于ThinkPHP开发的应用开源或商业产品发布/销售。
ThinkPHP可以支持Windows/Unix服务器环境,可运行于包括Apache、IIS在内的多种Web服务器。需要PHP5.0及以上版本支持。支持MySQL、MsSQL、PgSQL、Sqlite、Oracle等数据库。
ThinkPHP是一个免费开源、快捷、简单的OOP轻量级PHP开发框架。它遵循Apache 2开源协议发布。是为了敏捷的企业级开发而诞生的。获取ThinkPHP的方式有很多。
官方的网站为:。
SVN的下载地址为:
完整版本
核心版本
4.2 ThinkPHP架构
ThinkPHP遵循简洁实用的设计原则,兼顾开发速度和执行速度的同时,也注重易用性。本节内容将对ThinkPHP框架的整体思想和架构体系进行详细说明。
4.2.1 ThinkPHP的目录结构
ThinkPHP框架中目录分为两部分:系统目录和项目目录。系统目录是下载的ThinkPHP框架类库本身的,如表4.1所示。
表4.1 系统目录
目录 名 称
主要作用
Common
包含框架的一些公共文件、系统定义和惯例配置等
Lang
目录语言文件夹,目前ThinkPHP支持的语言包有简体中文、繁体中文、英文
Lib
系统的基类库目录。
Tpl
系统的模板目录
Mode
框架模式扩展目录
Vendor
第三方类库目录
项目目录是用户实际应用的目录,如表4.2所示(ThinkPHP采用自动创建文件夹的机制,当用户布置好ThinkPHP的核心类库后,编写运行入口文件,则相关应用到的项目目录就会自动生成)。
表4.2 项目目录
目录 名 称
主要作用
index.php
项目入口文件
Common
项目公共目录,放置项目公共函数
Lang
项目语言包目录(可选)
Conf
项目配置目录,放置配置文件
Lib
项目基目录,通常包括Action和Model目录
Tpl
项目模板目录
Runtime
项目运行时目录,包括Cache、Temp、Data和Log
4.2.2 自动生成目录
下面通过一个示例,讲解在ThinkPHP框架中如何自动生成项目目录。
例4.1 创建名称为4.1的项目,自动生成项目目录,其操作步骤如下。(实例位置:光盘\mr\04\4.1)
(1)在网站根目录下创建文件夹,并命名为4.1。
(2)将ThinkPHP核心类库存储于04目录下。
(3)编写入口文件index.php,将其存储于4.1目录下。index.php文件代码如下:
<?php
define('THINK_PATH', '../ThinkPHP'); //定义ThinkPHP框架路径(相对于入口文件)
define('APP_NAME', '4.1'); //定义项目名称
define('APP_PATH', '.'); //定义项目路径
require(THINK_PATH."/ThinkPHP.php"); //加载框架入口文件
App::run(); //实例化一个网站应用实例
?>
在运行index.php文件之前,4.1项目目录下只有一个index.php文件。但是,当在IE浏览器中运行此项目后,将输出如图4.1所示的运行结果,此为ThinkPHP提供的测试内容。此时再次查看4.1项目目录,如图4.2所示。在项目根目录下自动生成项目目录。
图4.1 已连接到ThinkPHP框架
图4. 2 自动生成的项目目录
4.2.3 项目目录部署方案
在实际开发过程中,目录结构往往由于项目的复杂而变得复杂。这里向大家推荐两套标准的目录部署方案:方案一如图4.3所示。
图4.3 项目部署方案一
方案二采用分组模块,如图4.4所示。
图4.4 项目部署方案二
这样部署的好处是系统目录和项目目录可以存储于非Web访问目录下面,网站目录下面只需放置Public公共目录和index.php入口文件(如果是多个项目的话,每个项目的入口文件都需要放到Web目录下面),从而提高网站的安全性。
4.2.4 命名规范
ThinkPHP框架有其自身的一定规范,要应用ThinkPHP框架开发项目,那麽就要尽量遵守它的规范。下面就介绍一下ThinkPHP的命名规范:
þ 类文件都是以.class.php为后缀(这里指的是ThinkPHP内部使用的类库文件,不代表外部加载的类库文件),使用驼峰法命名,并且首字母大写,例如DbMysql.class.php。
þ 函数、配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求)。
þ 确保文件的命名和调用大小写一致,是由于在类Unix系统上面,对大小写是敏感的(而ThinkPHP在调试模式下面,即使在Windows平台也会严格检查大小写)。
þ 类名和文件名一致(包括上面说的大小写一致),例如 UserAction类的文件命名是UserAction.class.php, InfoModel类的文件名是InfoModel.class.php,
þ 函数的命名使用小写字母和下划线的方式,例如 get_client_ip
þ Action控制器类以Action为后缀,例如 UserAction、InfoAction
þ 模型类以Model为后缀,例如UserModel、InfoModel
þ 方法的命名使用驼峰法,并且首字母小写,例如 getUserName
þ 属性的命名使用驼峰法,并且首字母小写,例如 tableName
þ 以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload
þ 常量以大写字母和下划线命名,例如 HAS_ONE和 MANY_TO_MANY
þ 配置参数以大写字母和下划线命名,例如HTML_CACHE_ON
þ 语言变量以大写字母和下划线命名,例如MY_LANG,以下划线开头的语言变量通常用于系统语言变量,例如 _CLASS_NOT_EXIST_。
þ 数据表和字段采用小写加下划线方式命名,例如 think_user 和 user_name
说明:在ThinkPHP里面,有一个函数命名的特例,就是单字母大写函数,这类函数通常是某些操作的快捷定义,或者有特殊的作用。例如,ADSL方法等等,他们有着特殊的含义。另外一点,ThinkPHP默认使用UTF-8编码,所以请确保程序文件采用UTF-8编码格式保存,并且去掉BOM信息头(去掉BOM头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理)。
4.2.5 项目构建流程
ThinkPHP具有项目目录自动创建功能,因此构建项目应用程序非常简单,您只需定义好项目的入口文件,在第一次访问入口文件时,系统会自动根据在入口文件中所定义的目录路径,迅速创建好项目的相关目录结构。在完成项目目录结构的创建后,看接下来都需要进行哪些工作,如图4.5所示,展示了ThinkPHP创建项目的基本流程。
图4.5 ThinkPHP项目构建流程
例4.2 根据上述讲解的流程,创建一个名称为4.2的项目,读取db_database04数据库中的数据,其操作步骤如下。(实例位置:光盘\mr\04\4.2)
(1)创建db_database04数据库,创建think_user数据表。数据表结构如图4.6所示
图4.6 ThinkPHP项目构建流程
(2)载入ThinkPHP系统文件,编辑入口文件index.php,创建名称为4.2的项目。index.php的代码如下:
<?php
define('THINK_PATH', '../ThinkPHP/'); // 定义ThinkPHP框架路径
define('APP_NAME', '4.2'); //定义项目名称和路径
define('APP_PATH', '.'); //定义项目名称和路径
require(THINK_PATH."/ThinkPHP.php"); // 加载框架入口文件
App::run();//实例化一个网站应用实例
?>
(3)自动生成的项目目录中已经创建了一个空的项目配置文件,位于项目的Conf目录下面,名称是config.php。重新编辑此文件,完成数据库的配置。config.php文件的代码如下:
<?php
return array(
'APP_DEBUG' => true, // 开启调试模式
'DB_TYPE'=> 'mysql', // 数据库类型
'DB_HOST'=> 'localhost', // 数据库服务器地址
'DB_NAME'=>'demo', // 数据库名称
'DB_USER'=>'root', // 数据库用户名
'DB_PWD'=>'111', // 数据库密码
'DB_PORT'=>'3306', // 数据库端口
'DB_PREFIX'=>'think_', // 数据表前缀
);
?>
(4)在项目的Lib\Action目录下,定位到自动生成的IndexAction.class.php文件,这是ThinkPHP的控制器,即Index模块。重新编辑控制器的index方法,查询指定数据表中的数据,并且完成数据的循环输出。其代码如下:
<?php
class IndexAction extends Action{
public function index() {
$db = new Model('user'); //实例化模型类,参数数据表名称,不包含前缀
$select = $db->select(); //查询数据
$this->assign('select',$select); //模板变量赋值
$this->display(); //输出模板
}
}
?>
(5)在项目的Tpl\default目录下,创建Index目录,存储Index模块的模板文件index.html。完成数据库中数据的循环输出,其代码如下:
<!--循环输出查询结果数据集-->
<volist name='select' id='user' >
ID:{$user.id}<br/>
用户名: {$user.user}<br/>
地址: {$user.address}<hr>
</volist>
(6)在IE浏览器中输入http://127.0.0.1/ mr/04/4.2/,其运行结果如图4.7所示。
图4.7 了解ThinkPHP项目构建流程
4.3 ThinkPHP的配置
配置文件是ThinkPHP框架程序得以运行的基础条件,框架的很多功能都需要在配置文件中配置之后,才可以生效。包括:URL路由功能,页面伪静态和静态化等等。ThinkPHP提供了灵活的全局配置功能,采用最有效率的PHP返回数组方式定义,支持惯例配置、项目配置、调试配置和模块配置,并且会自动生成配置缓存文件,无需重复解析。
ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次如图4.8所示。
图4.8 分层配置模式的顺序
以上是配置文件的加载顺序,但是因为后面的配置会覆盖之前的配置(在没有生效的前提下),所以优先顺序从右到左。系统的配置参数是通过静态变量全局存取的,存取方式非常简单高效。
4.3.1 配置格式
ThinkPHP框架中所有配置文件的定义格式均采用返回PHP数组的方式,格式为:
<?php
return array(
'APP_DEBUG' => true,
'URL_MODEL' => 2,
// ……更多的配置参数
);
?>
注意:配置参数不区分大小写(因为无论使用大小写定义,都会转换成小写)。但是习惯上保持大写定义的原则。另外,还可以在配置文件中使用二维数组来配置更多的信息。例如:
<?php
return array(
'APP_DEBUG' => true,
'USER_CONFIG' => array(
'USER_AUTH' => true,
'USER_TYPE' => 2,
),
);
?>
系统目前最多支持二维数组的配置级别,每个项目配置文件除了定义ThinkPHP所需要的配置参数之外,开发人员可以在里面添加项目需要的一些配置参数,用于自己的应用。项目配置文件默认存储于项目的Conf目录。例如,在示例4.2中,连接数据库的配置文件存储于项目的4.2\Conf\config.php文件中。
技巧:项目配置指的是项目的全局配置,因为一个项目除了可以定义项目配置文件之外,还可以定义模块配置文件用于针对某个特定的模块进行特殊的配置。他们的定义格式都是一致的,区别只是配置文件命名的不同。系统会自动在不同的阶段读取配置文件。
4.3.2 调试配置
如果启用调试模式的话,那么会导入框架默认的调试配置文件,默认的调试配置文件位于Think\Common\debug.php,如果没有检测到项目的调试配置文件,就会直接使用默认的调试配置参数。项目定义自身的调试配置文件的话,则会和默认的调试配置文件合并,也就是说,项目配置文件也只需要配置和默认调试配置不同的参数或者新增的参数。
调试配置文件也位于项目配置目录下面,文件名是debug.php。通常情况下,调试配置文件里面可以进行一些开发模式所需要的配置。例如,配置额外的数据库连接用于调试,开启日志写入便于查找错误信息、开启页面Trace输出更多的调试信息等等。系统默认的调试配置文件中设置如下内容:
þ 开启日志记录
þ 关闭模板缓存
þ 记录SQL日志
þ 关闭字段缓存
þ 开启运行时间详细显示(包括内存、缓存情况)
þ 开启页面Trace信息显示
þ 严格检查文件大小写(即使是Windows平台)
4.4 ThinkPHP的控制器
4.4.1 控制器
ThinkPHP的控制器就是模块类,通常位于项目的Lib\Action目录下面。类名就是模块名加上Action后缀,例如:IndexAction类表示Index模块。控制器类必须继承系统的Action基础类,这样才能确保使用Action类内置的方法。
而index操作其实就是IndexAction类的一个公共方法,所以在浏览器中输入http://localhost/myApp/index.php/Index/index/,其实就是执行IndexAction类的index(公共)方法。
注意:每个模块的操作并非一定要定义操作方法,如果只是希望输出一个模板,既没有变量也没有任何的业务逻辑,那么只要按照规则定义好操作对应的模板文件即可,而不需要定义操作方法。例如,在IndexAction中如果没有定义help方法,但是存在对应的Index/help.html 模板文件,那么http://localhost/04/index.php/Index/help/依然可以正常运作,因为系统找不到IndexAction类的help方法,会自动定位到Index模块的模板目录中查找help.html模板文件,然后直接输出。
4.4.2 跨模块调用
在开发过程中经常会在当前模块调用其他模块的方法,这个时候就涉及到跨模块调用。下面通过A和R两个快捷方法完成跨模块调用。
$User = A("User"); // 实例化UserAction控制器对象
$User->insert(); // 调用User模块的importUser操作方法
这里的A("User") 是一个快捷方法,与下面的代码等效:
import("@.Action.UserAction");
$User = new UserAction();
事实上,在这个例子里面还有比A方法更简单的调用方法,例如:
R("User","insert"); //远程调用UserAction控制器的insert操作方法
上面只是在当前项目中调用,如果需要在多个项目之间调用方法,一样可以完成:
$User = A("User","Admin"); //实例化Admin项目的UserAction控制器对象
$User->insert(); //调用Admin项目UserAction控制器的insert操作方法
R("User","insert","Admin"); // 远程调用Admin项目的UserAction控制器的insert操作方法
例4.3 应用跨模块调用的方法,在前台控制器中调用后台项目中的insert方法完成用户信息的添加操作,其操作步骤如下。(实例位置:光盘\mr\04\4.3)
(1)创建4.3项目根目录,在根目录下分别创建前台项目文件夹Home、后台项目文件夹Admin和Public文件夹存储CSS、图片和JS脚本等文件。
(2)在4.3项目根目录下,编辑index.php前台入口文件和admin.php后台入口文件。其关键代码如下:
//Index.php前台入口文件
<?php
define('THINK_PATH', '../ThinkPHP'); //定义ThinkPHP框架路径(相对于入口文件)
define('APP_NAME', 'Home'); //定义项目名称
define('APP_PATH', './Home'); //定义项目路径
require(THINK_PATH."/ThinkPHP.php"); //加载框架入口文件
App::run(); //实例化一个网站应用实例
?>
//Admin.php后台入口文件
<?php
define('THINK_PATH', '../ThinkPHP'); //定义ThinkPHP框架路径(相对于入口文件)
define('APP_NAME', 'Admin'); //定义项目名称
define('APP_PATH', './Admin'); //定义项目路径
require(THINK_PATH."/ThinkPHP.php"); //加载框架入口文件
App::run(); //实例化一个网站应用实例
?>
(3)在IE浏览器中运行前后台的入口文件,自动生成项目目录。
(4)定位到Admin\Conf目录下,编辑config.php文件,完成后台项目中数据库的配置。其代码如下:
<?php
return array(
'APP_DEBUG' => false, // 关闭调试模式
'DB_TYPE'=> 'mysql', // 数据库类型
'DB_HOST'=> 'localhost', // 数据库服务器地址
'DB_NAME'=>'db_database04', // 数据库名称
'DB_USER'=>'root', // 数据库用户名
'DB_PWD'=>'111', // 数据库密码
'DB_PORT'=>'3306', // 数据库端口
'DB_PREFIX'=>'think_', // 数据表前缀
);
?>
(5)定位到Admin\Lib\Action目录下,编写后台项目的控制器。首先创建Index模块,继承系统的Action基础类,定义index()方法读取指定数据表中的数据,并且将查询结果赋给模板变量,最终指定模板页。IndexAction.class.php的代码如下:
<?php
header("Content-Type:text/html; charset=utf-8"); //设置页面编码格式
class IndexAction extends Action{
public function index() {
$db = new Model('user'); // 实例化模型类,参数数据表名称,不包含前缀
$select = $db->select(); // 查询数据
$this->assign('select',$select); // 模板变量赋值
$this->display(); // 输出模板
}
}
?>
然后创建User模块,同样继承系统的Action基础类,定义insert()方法,实例化模型类,将表单中提交的数据添加到指定的数据表中,添加成功后重定向到后台主页。UserAction.class.php的代码如下:
<?php
header("Content-Type:text/html; charset=utf-8"); //设置页面编码格式
class UserAction extends Action{ //定义类,继承基础类
public function insert() { //定义方法
$ins = new Model('user'); // 实例化模型类,传递参数为没有前缀的数据表名称
$ins->Create(); // 创建数据对象
$result = $ins->add(); // 写入数据库
$this->redirect('Index/index','', 5,'页面跳转中'); //页面重定向
}
}
?>
(6)定位到Admin\Tpl\default目录下,首先创建Index模块文件夹,编辑index操作的模板文件index.html,循环输出模板变量传递的数据。index.html模板文件的关键代码如下:
<volist name='select' id='user' >
<tr class="content">
<td bgcolor="#FFFFFF"> {$user.id}</td>
<td bgcolor="#FFFFFF"> {$user.user}</td>
<td bgcolor="#FFFFFF"> {$user.address}</td>
</tr>
</volist>
然后创建User模块文件夹,编程insert操作的模板文件index.html,创建添加用户信息的表单。其关键代码如下:
<form method="post" action="__URL__/insert" >
<td><input name="user" type="text" size="15" /></td>
<td><input name="pass" type="password" size="15" /></td>
<td><input name="address" type="text" size="20" /></td>
<input type="image" name="imageField" id="imageField" src="__ROOT__/Public/images/66_05.gif" />
</form>
(7)定位到Home\Conf目录,编辑前台项目的数据库配置文件config.php。
(8)定位到Home\Lib\Action目录,创建前台项目控制器Index。定义index()方法查询数据库中的用户信息,并且将查询结果赋给模板变量;定义insert()方法,通过R快捷方式调用Admin项目UserAction控制器的insert操作方法完成数据的添加操作。IndexAction.class.php的代码如下:
<?php
header("Content-Type:text/html; charset=utf-8"); //设置页面编码格式
class IndexAction extends Action{
public function index() {
$db = new Model('user'); // 实例化模型类,参数数据表名称,不包含前缀
$select = $db->select(); // 查询数据
$this->assign('select',$select); // 模板变量赋值
$this->display(); // 输出模板
}
public function insert() {
$ins=R("User","insert","Admin"); //远程调用Admin项目UserAction控制器的insert操作方法
$ins->Create(); // 创建数据对象
$result = $ins->add(); // 写入数据库
}
}
?>
(9)定位到Home\Tpl\default目录下,创建Index模块文件夹,编辑index操作的模板文件index.html。在index.html模板文件中,创建表单提交用户注册信息,循环输出模板变量传递的数据。
(10)在IE浏览器中输入http://127.0.0.1/ mr/04/ 4.3/,其运行效果如图4.9所示。
图4.9 跨模块调用完成用户注册
技巧:网页重定向,Action类的redirect方法可以实现页面的重定向功能。redirect方法的定义规则如下(方括号内参数根据实际应用决定):
redirect('[项目://][路由@][分组名-模块/]操作? 参数1=值1[&参数N=值N]')
或者用数组的方式传入参数
redirect('[项目://][路由@][分组名-模块/]操作',array('参数1'=>'值1' [,'参数N'=>'值N']))
如果不定义项目和模块的话 就表示当前项目和模块名称。例如:
$this->redirect('Index/index','', 5,'页面跳转中'); //页面重定向
停留5秒后跳转到Index模块的index操作,并且显示页面跳转中字样,重定向后会改变当前的URL地址。
4.5 ThinkPHP的模型
顾名思义,模型就是按照某一个形状进行操作的代名词。模型的主要作用是,封装数据库的相关逻辑。也就是说,每执行一次数据库操作,都要遵循定义的数据模型规则来完成。
4.5.1 实例化模型
在ThinkPHP2.0版本中,无需进行任何模型定义(只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的),可以直接进行模型的实例化操作。根据不同的模型定义,实例化模型的方法也有所不同,下面来分析一下什么情况下使用什么方法。
1.实例化基础模型(Model)类
在没有定义任何模型的时候,可以使用下面的方法实例化一个模型类来进行操作:
$User = new Model('User');
$User->select(); // 进行其他的数据操作
或者使用M快捷方法进行实例化,其效果是相同的。
$User = M('User');
$User->select(); // 进行其他的数据操作
这种方法最简单高效,因为不需要定义任何的模型类,所以支持跨项目调用。缺点也是因为没有自定义的模型类,因此无法写入相关的业务逻辑,只能完成基本的CURD操作。在例4.2和4.4中采用的都是实例化基础模型类,对数据库中数据进行读取、添加操作。
2.实例化其他模型类
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。
M方法默认是实例化Model类,如果需要实例化其他模型类,可以使用:
$User = M('User', 'CommonModel');
上面的方法等效于:
$User = new CommonModel('User');
因为系统的模型类都能够自动加载,因此不需要在实例化之前手动进行类库导入操作。模型类commonModel必须继承Model,如果没有定义别名导入的话,需要放在项目Model下。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果项目的数据表超过100个,而且大多数都是执行基本的CURD操作,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
3.实例化用户定义的模型(×××Model)类
这种情况是使用的最多的,一个项目不可避免的需要定义自身的业务逻辑实现,就需要针对每个数据表定义一个模型类,例如UserModel 、InfoModel等等。
定义的模型类通常都是放到项目的Lib\Model目录下面。例如:
class UserModel extends Model{
Public function myfun(){
// 添加自己的业务逻辑
// ………
}
}
其实模型类还可以继承一个用户自定义的公共模型类,而不是只能继承Model类。要实例化自定义模型类,可以使用下面的方式:
$User = new UserModel();
$User->select(); // 进行其他的数据操作
还可以使用D快捷方法进行实例化,其效果是相同的。
$User = D('User');
$User->select(); // 进行其他的数据操作
D方法可以自动检测模型类,不存在时系统会抛出异常,同时对于已实例化过的模型,不会重复去实例化。默认的D方法只能支持调用当前项目的模型,如果需要跨项目调用,需要使用:
$User = D('User', 'Admin'); // 实例化Admin项目下面的User模型
$User->select();
如果启用模块分组功能,还可以使用:
$User = D('Admin.User');
4.实例化空模型类
如果仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作,例如:
$Model = new Model();
// 或者使用M快捷方法实例化是等效的
// $Model = M();
$Model->query('SELECT * FROM think_user where status=1');
空模型类也支持跨项目调用。
例4.4 通过M方法实例化Model类,完成数据库中用户信息和类别信息的输出,其关键操作步骤如下。(实例位置:光盘\mr\04\4.4)
(1)创建4.4项目根目录,在根目录下创建项目文件夹App和Public文件夹存储CSS、图片和JS脚本等文件。
(2)在4.4项目根目录下,编辑index.php入口文件。其关键代码如下:
<?php
define('THINK_PATH', '../ThinkPHP'); //定义ThinkPHP框架路径(相对于入口文件)
define('APP_NAME', 'App'); //定义项目名称
define('APP_PATH', './App'); //定义项目路径
require(THINK_PATH."/ThinkPHP.php"); //加载框架入口文件
App::run(); //实例化一个网站应用实例
?>
(3)在IE浏览器中运行入口文件,自动生成项目目录。
(4)定位到App\Conf目录下,编辑config.php文件,完成项目中数据库的配置。其代码如下:
<?php
return array(
'APP_DEBUG' => false, // 关闭调试模式
'DB_TYPE'=> 'mysql', // 数据库类型
'DB_HOST'=> 'localhost', // 数据库服务器地址
'DB_NAME'=>'db_database04', // 数据库名称
'DB_USER'=>'root', // 数据库用户名
'DB_PWD'=>'111', // 数据库密码
'DB_PORT'=>'3306', // 数据库端口
'DB_PREFIX'=>'think_', // 数据表前缀
);
?>
(5)定位到App\Lib\Action目录下,编写项目的控制器。创建Index模块,继承系统的Action基础类,定义index()方法,通过M方法实例化模型类,读取think_user数据表中的数据,并且将查询结果
展开阅读全文