内容简介:thinkPHP学习笔记之基础概念(一)
这里记录的是本人学习的thinkPHP笔记官方开发手册
http://document.thinkPHP.cn/manual_3_2.HTML
一、thinkPHP3.2目录结构
工程目录
www WEB部署目录(或者子目录)
├─index.PHP 入口文件
├─README.md README文件
├─Application 应用目录
├─Public 资源文件目录
└─ThinkPHP 框架目录
TP框架结构
├─ThinkPHP 框架系统目录(可以部署在非web目录下面)
│ ├─Common 核心公共函数目录
│ ├─Conf 核心配置目录
│ ├─Lang 核心语言包目录
│ ├─Library 框架类库目录
│ │ ├─Think 核心Think类库包目录
│ │ ├─Behavior 行为类库目录
│ │ ├─Org Org类库包目录
│ │ ├─Vendor 第三方类库目录
│ │ ├─ … 更多类库目录
│ ├─Mode 框架应用模式目录
│ ├─Tpl 系统模板目录
│ ├─LICENSE.txt 框架授权协议文件
│ ├─logo.png 框架LOGO文件
│ ├─README.txt 框架README文件
│ └─ThinkPHP.PHP 框架入口文件
从3.2开始TP默认给我们提供了一个已经配置好的入口文件和一个应用程序目录,应用程序目录是空的,当你第一在浏览器中输入"localhost/工程名称/"的时候会在application目录自动生成一个程序,目录如下:
Application
├─Common 应用公共模块
│ ├─Common 应用公共函数目录
│ └─Conf 应用公共配置文件目录
├─Home 默认生成的Home模块
│ ├─Conf 模块配置文件目录
│ ├─Common 模块函数公共目录
│ ├─Controller 模块控制器目录
│ ├─Model 模块模型目录
│ └─View 模块视图文件目录
├─Runtime 运行时目录
│ ├─Cache 模版缓存目录
│ ├─Data 数据目录
│ ├─Logs 日志目录
│ └─Temp 缓存目录
二、TP命名规范
TP命名采用驼峰法命名,对于类名首字母要大写,对于M类和C类要有Model后缀和Controller后缀。
-
对于控制器类:类名+Controller.class.PHP 并且继承自extends Controller或者Controller的子类
-
对于模型类:类名+Model.class.PHP 并且继承自extends Model或者Model的子类
-
对于视图文件名:Home/View/模块名(以对应控制器命名的文件夹)/视图名(以对应控制器中要显示该视图函数的名称命名)
注:对于视图文件的命名方式可以随意,但是在控制器中显示该视图的函数中display方法就要带有参数了,参数的方式有多中
例如:对应控制器sunleiController.class.PHP 视图的路径为:/Home/View/long/add.HTML
控制其中有一个方法sun(),此方法中的display需要这样写$this->display(‘long:add’);,这种方式不是唯一的,也可以用其他形式的参数
在浏览器中输入localhost/工程名/index.PHP/sunlei/sun 即可
三、解释下其中的几个概念:
名称 | 描述 |
---|---|
应用 | 基于同一个入口文件访问的项目我们称之为一个应用。 |
模块 | 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录,包含配置文件,MVC文件等,3.2以后默认生成一个Home模块。 |
控制器 | 每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。 |
操作 | 每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元。 |
模块化设计的思想下面,模块是最重要的部分,模块其实是一个包含配置文件、函数文件和MVC文件(目录)的集合。
四、URL模式
官方链接:http://document.thinkPHP.cn/manual_3_2.HTML#url
如果我们直接访问入口文件的话,由于URL中没有模块名、控制器名称(不包括Controller后缀)和操作名称(函数名称),因此系统会访问默认模块(Home)下面的默认控制器(Index)的默认操作(index),因此下面的访问是等效的:
http://serverName/index.PHP
http://serverName/index.PHP/Home/Index/index
http://serverName/index.PHP/?m=Home/Index&a=index
上面这种URL模式就是系统默认的PATHINFO模式,也是最常用的模式,不同的URL模式获取模块和操作的方法不同,ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式,可以设置URL_MODEL参数改变URL模式。
URL模式 | URL_MODEL设置 |
---|---|
普通模式 | 0 |
PATHINFO模式 | 1 |
REWRITE模式 | 2 |
兼容模式 | 3 |
如果你整个应用下面的模块都是采用统一的URL模式,就可以在 应用的 配置文件中设置URL模式,如果不同的模块需要设置不同的URL模式,则可以在 模块的 配置文件中设置。
五、函数参数的绑定
参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块、控制器和操作名)和操作方法中的参数进行绑定。
要启用参数绑定功能,首先确保你开启了URL_PARAMS_BIND设置:
'URL_PARAMS_BIND' => true, // URL变量绑定到操作方法作为参数
参数绑定有两种方式:按照变量名绑定(默认)和按照变量顺序绑定。
注意:对于带有参数的函数,如果URL没有传入对应的参数值,则会报错,为避免报错我们可以给函数设置一个默认值
如:
public function read($id=0){
echo 'id='.$id;
}
六、伪静态
URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行。例如,我们设置
'URL_HTML_SUFFIX'=>'sHTML'
的话,我们可以把下面的URL http://serverName/Home/Blog/read/id/1 变成 http://serverName/Home/Blog/read/id/1.sHTML
后者更具有静态页面的URL特征,但是具有和前面的URL相同的执行效果,并且不会影响原来参数的使用。
默认情况下,伪静态的设置为HTML,如果我们设置伪静态后缀为空,
'URL_HTML_SUFFIX'=>''
则可以支持所有的静态后缀,并且会记录当前的伪静态后缀到常量 EXT ,但不会影响正常的页面访问。
例如:
http://serverName/Home/blog/3.HTML
http://serverName/Home/blog/3.sHTML
http://serverName/Home/blog/3.xml
http://serverName/Home/blog/3.pdf
都可以正常访问,如果要获取当前的伪静态后缀,通过常量 EXT 获取即可。
如果希望支持多个伪静态后缀,可以直接设置如下:
// 多个伪静态后缀设置 用|分割
'URL_HTML_SUFFIX' => 'HTML|sHTML|xml'
那么,当访问 http://serverName/Home/blog/3.pdf 的时候会报系统错误。
可以设置禁止访问的URL后缀,例如:
'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg', // URL禁止访问的后缀设置
如果访问 http://serverName/Home/blog/3.pdf 就会直接返回404错误。
注意:
URL_DENY_SUFFIX的优先级比URL_HTML_SUFFIX要高。
七、URL的大小写问题
对于Windows来说URL是不区分大小写的,但是在 Linux 下是区分大小写的,但是TP框架给了我们配置的权利,我们可以通过配置
'URL_CASE_INSENSITIVE' =>true
来达到在任何平台下都不区分大小写
这里需要注意一个地方,一旦开启了不区分URL大小写后,如果我们要访问类似UserTypeController的控制器,那么正确的URL访问应该是:
// 正确的访问地址
http://serverName/index.PHP/home/user_type/index
// 错误的访问地址(Linux环境下)
http://serverName/index.PHP/home/usertype/index
利用系统提供的U方法可以为你自动生成相关的URL地址。
如果设置
'URL_CASE_INSENSITIVE' =>false
的话,URL就又变成: http://serverName/index.PHP/Home/UserType/add
注意:URL不区分大小写并不会改变系统的命名规范,并且只有按照系统的命名规范后才能正确的实现URL不区分大小写。
建议还是习惯性的区分大小写吧,系统默认的规范是根据URL里面的模块名、控制器名来定位到具体的控制器类的,从而执行控制器类的操作方法。
在MVC三层中,ThinkPHP并不依赖M或者V,甚至可以只有C或者只有V,这个在ThinkPHP的设计里面是一个很重要的用户体验设计,用户只需要定义视图,在没有C的情况下也能自动识别。
八、库文件自动加载的顺序(优先级)
在实际的应用类库加载过程中,往往会涉及到自动加载的优先级问题,以Test/MyClass类为例,自动加载的优先顺序如下:
1.判断是否有注册了Test/MyClass类库映射,如果有则自动加载类库映射定义的文件;
2.判断是否存在Library/Test目录,有则以该目录为初始目录加载;
3.判断是否有注册Test根命名空间,有则以注册的目录为初始目录加载;
4.如果以上都不成立,则以Test为模块目录进行初始目录加载;
5.然后以上面获取到的初始目录加载命名空间对应路径的文件;
九、TP常用函数
-
U函数
用于获取URL的:U()
U('/Admin/Insert/insert@localhost’)
-
C函数
之前的方式都是通过预先定义配置文件的方式,而在具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数。
设置新的值:
C('参数名称','新的参数值')
动态配置赋值仅对当前请求有效,不会对以后的请求造成影响。
获取已设置的配置参数的值:
$config = C('参数名称');
-
A函数
默认情况下,A方法实例化的是默认控制器层(Controller)
如果控制器有分层控制器,要实例化分层控制器的话,则写二级模块名,否则第二个参数可以忽略
A('模块名/控制器名','二级模块名')
访问控制器(默认是Home,可以设置)的实例化通常是自动完成的,系统会根据URL地址解析出访问的控制器名称自动实例化,并且调用相关的操作方法。
如果你需要跨控制器调用的话,则可以单独实例化:
// 实例化Home模块的User控制器 $User = new /Home/Controller/UserController(); // 实例化Admin模块的Blog控制器 $Blog = new /Admin/Controller/BlogController();
系统为上面的控制器实例化提供了一个快捷调用方法A,上面的代码可以简化为:
// 假设当前模块是Home模块 $User = A('User'); $Blog = A('Admin/Blog');
默认情况下,A方法实例化的是默认控制器层(Controller),如果你要实例化其他的分层控制器的话,可以使用:
// 假设当前模块是Home模块 // 实例化Event控制器 $User = A('User','Event'); $Blog = A('Admin/Blog','Event');
上面的代码等效于:
// 实例化Home模块的User事件控制器 $User = new /Home/Event/UserEvent(); // 实例化Admin模块的Blog事件控制器 $Blog = new /Admin/Event/BlogEvent();
以上所述就是小编给大家介绍的《thinkPHP学习笔记之基础概念(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 大数据基础:Spark 工作原理及基础概念
- Apache Flink 零基础入门(一):基础概念解析
- Apache Flink 零基础入门(一):基础概念解析
- lucene基础概念
- React 入门 (基础概念)
- Kubernetes 基础概念
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Open Data Structures
Pat Morin / AU Press / 2013-6 / USD 29.66
Offered as an introduction to the field of data structures and algorithms, Open Data Structures covers the implementation and analysis of data structures for sequences (lists), queues, priority queues......一起来看看 《Open Data Structures》 这本书的介绍吧!