PHP框架基础语法学习
前言
刚好最近做的挺多挖链子的题目都有涉及命名空间的知识点,之前都是在一个php文件中进行了链子的挖掘,现在分散到很多文件中,虽然本质是一样的,但是如果没有理解好命名空间的含义,一时半会想要做出来也是有难度的
命名空间
要理解好命名空间的话可以和目录做一个类比,比如说有一个目录为/home他下面有一个foo.txt,那么对于这个foo.txt来说,这个home就是一个命名空间,
命名空间的声明可避免类或函数名重复导致的各种问题。使用namespace可以声明、切换命名空间。
在程序当中,其作用是按照一种虚拟的层次结构组织 PHP 代码,这种层次结构类似操作系统中文件系统的目录结构。
直接举个栗子:一个典型的控制器类定义如下:
namespace app\index\controller; |
控制器类文件的实际位置是
application\index\controller\Index.php |
当控制器的定义为:
namespace app\index\controller; |
那么想要访问不同的路由就要:
http://localhost/index.php/index/Index/hello |
回来看一下源码要访问下面的内容的路由就为
/index.php/index/index/backdoor |
什么是控制器?
控制器就是MVC
设计模式中的C(Controller
),通常用于读取视图V(View
)、完成用户输入以及处理模型数据M(Model
)。
按照ThinkPHP的架构设计,所有的URL请求(无论是否采用了路由),最终都会定位到控制器(也许实际的类不一定是控制器类,但也属于广义范畴的控制器)。控制器的层可能有很多,为了便于区分就把通过URL访问的控制器称之为访问控制器(通常意义上我们所说的控制器就是指访问控制器)。
例如我们访问一个URL地址:
http://tp5.com/index/index/hello |
实际上访问的是index
模块下的Index
控制器类的hello
方法(在没有定义任何路由的情况下),Index
控制器对应的类就是app\index\controller\Index
(为什么控制器类名需要这样命名后面命名空间部分会详细描述),完成上面的URL访问,只需要定义如下的控制器类,看起来非常简单:
什么是命名空间
现在来分析下控制器的类名为什么是app\index\controller\Index
而不是Index
,首先就是要明白命名空间的概念。PHP从5.3版本开始引入命名空间的概念,其主要作用是确保类名不会冲突,因为在一个应用中,出现相同的类名的几率非常之大,并且你很难保证引入的第三方类库不冲突,而有了命名空间后,相当于给自己的类加了一个门牌号一样,一个类的组成包括:
类的组成 = 根命名空间+子命名空间(可选)+类名
app\index\controller\Index,这是ThinkPHP框架制定的规范,
app是应用类库的根命名空间,也就是所有的应用类库都应该用
app作为根命名空间定义。
index是表示模块目录,
controller表示的是控制器(确切的说是访问控制器)目录,
Index是实际的控制器类名,所以要表示
index模块的
Index控制器类,使用的就是
app\index\controller\Index,如果是
admin模块的
Index控制器类,使用的就是
app\admin\controller\Index类,如果使用的是单一模块的话,那么
Index控制器类就变成了
app\controller\Index
控制器继承
前面是一个很简单的例子,没有继承任何的类(这样并没有任何不对,5.0的控制器设计如此,事实上也非常高效),控制器可以继承系统内置的控制器基类think\Controller
或者应用自己的控制器基类,来扩展更多的功能和方法。
继承系统控制器基类:
<?php |
PHP框架基础语法学习