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后缀。

  1. 对于控制器类:类名+Controller.class.php 并且继承自extends Controller或者Controller的子类
  2. 对于模型类:类名+Model.class.php 并且继承自extends Model或者Model的子类
  3. 对于视图文件名: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常用函数

  1. U函数
    用于获取URL的:U()
U('/Admin/Insert/insert@localhost’)
  1. C函数
    之前的方式都是通过预先定义配置文件的方式,而在具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数。
    设置新的值:
    C('参数名称','新的参数值')
    动态配置赋值仅对当前请求有效,不会对以后的请求造成影响。
    获取已设置的配置参数的值:
$config = C('参数名称');
  1. 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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,297评论 0 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 如图项目结构目录 首先将引入的项目直接导入或者拖进你的项目中,然后进行如下操作即可。 整个过程非常简单,但是遇到了...
    天空没有太阳阅读 4,780评论 0 51
  • 2017-7-24 --著:江涵小子 丁环小宝 甜蜜幸福饶心梁 寻找真情在侧旁 丁环小宝与江涵 互诉衷肠爱永伴
    江涵少年阅读 123评论 0 0