PHP框架基础语法学习

前言

刚好最近做的挺多挖链子的题目都有涉及命名空间的知识点,之前都是在一个php文件中进行了链子的挖掘,现在分散到很多文件中,虽然本质是一样的,但是如果没有理解好命名空间的含义,一时半会想要做出来也是有难度的

命名空间

要理解好命名空间的话可以和目录做一个类比,比如说有一个目录为/home他下面有一个foo.txt,那么对于这个foo.txt来说,这个home就是一个命名空间,

命名空间的声明可避免类或函数名重复导致的各种问题。使用namespace可以声明、切换命名空间。

在程序当中,其作用是按照一种虚拟的层次结构组织 PHP 代码,这种层次结构类似操作系统中文件系统的目录结构。

直接举个栗子:一个典型的控制器类定义如下:

namespace app\index\controller;

class Index
{
public function index()
{
return 'index';
}
}

控制器类文件的实际位置是

application\index\controller\Index.php

当控制器的定义为:

namespace app\index\controller;

class Index
{
public function hello()
{
return 'hello,world!';
}

public function data()
{
return ['name'=>'thinkphp','status'=>1];
}

}

那么想要访问不同的路由就要:

http://localhost/index.php/index/Index/hello
http://localhost/index.php/index/Index/data

回来看一下源码要访问下面的内容的路由就为

/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
namespace app\index\controller;

use think\Controller;

class Index extends Controller
{
public function hello()
{
return 'hello,world';
}
}
Author

vague huang

Posted on

2021-09-26

Updated on

2022-03-03

Licensed under

Comments