6月14 空控制器和空操作及命名空间

空操作和空控制器处理

空操作:就没有指定的操作方法

空控制器:没有指定控制器

1.空操作:(Admin是不存在的)

一般网站处于安全考虑不给用户提示任何错误信息

       “空操作”本质意思:一个对象(控制器)调用本身不存在的方法

       在OOP里边,对象调用本身不存在方法,处于用户体验比较好的角度考虑,我们可以在类里边制作一个魔术方法:function __call();

在tp里面控制器的父类:

父类中有个方法:

所以空操作有两种解决方案:

①     在对应的控制器里边制作一个方法,名称为”_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用)

②     给空操作的名称制作一个同名的模板出来,系统会自动调用(之前可以后来不可以)

<?php
namespace HomeController;
use ThinkController;
class MainController extends Controller
{
    public function Xianshi()
    {
        echo "Hello<br>";   
    } 
    public function _empty()
    {
        echo "空操作,网页不存在,请检查浏览器信息";//http://localhost:8080/tp/index.php/Home/Login/Admin(admin不存在)
    }

现在的运行结果更为安全

2.空控制器

空控制器:在实例化控制器对象的时候,没有找到指定的类

什么时候实例化控制器对象:ThinkPHP/Library/Think/App.class.php

熟记文件:

              index.php  入口文件

              ThinkPHP/ThinkPHP.php  框架核心文件

              ThinkPHP/Library/Think/Think.class.php  框架核心文件

              ThinkPHP/Library/Think/App.class.php  框架应用文件

在App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容:

空控制器处理方案:可以再制作一个控制器,名称EmptyController.class.php

在该控制器内部其实只需要制作一个_empty()方法即可。

<?php
namespace HomeController;
use ThinkController;
class EmptyController extends Controller
{
    public function _empty()
    {
        echo "空控制器,访问页面不存在";    
    }        
} 

 现在的运行结果:

 3.跨控制器调用

跨控制器的调用可以省去很多的代码,更让人看清楚,

一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。

3.1同一模块下的操作

如下所示操作同一模块下的MainController.class.php和IndexController.class.php

在IndexController.class.php里面新建方法Shuchu

public function Shuchu()
    {
        echo "最喜欢的是你懂得";    
    }

在MainController.class.php里面新建方法Shishi

A(“[模块/]控制器标志”) 实例化控制器对象

R([模块/]控制器标志/操作方法)

public function Shishi()
    {
        //造对象
        //$index = new IndexController;    
        //echo $index->Shuchu();
        
        //使用A方法
        //$index = A("Index");
        //echo $index->Shuchu();
        
        //使用R方法,造对象并且调用某个特定的操作方法
        echo R("Index/Shuchu");
}

运行过后的结果:

3.2不同模块下的操作

仿照Home模块新建Admin里面的东西包含的目录都要一致

在Controller目录下新建TestController.class.php

<?php
namespace AdminController;
use ThinkController;
class TestController extends Controller
{
    public function Test()
    {
        //echo "hello";
        return "是Admin模块下的内容";    
    }
}

现在想要在Home/Controller/ MainController.class.php中也调用Text()方法

public function Shishi()
    {
        
        //跨模块调用
        //$test = A("Admin/Test");
        //echo $test->Test();
        
        echo R("Admin/Test/Test");
    }

运行后的结果:

4.命名空间

命名空间:
相当于一个虚拟的目录


正常管理文件使用文件夹--物理区分


TP框架的初始命名空间是:ThinkPHPLibrary

在TP框架下命名空间里面使用代表的是初始命名空间(ThinkPHPLibrary)

1.系统目录下根命名空间是ThinkPHPLibrary下面的文件夹名称命名的

2.模块的根命名空间是以模块名命名的

在定义命名空间的时候需要从根写起例如:HomeController 例如:ThinkModel


如果要使用某个类文件,引入该类命名空间的时候:
使用use关键字,后面写该类的命名空间 后面加上 "文件名"

如果不想引入命名空间:在造类的对象的时候可以使用(初始命名空间)来找到对应的类
例如:new ThinkPage(30);

原文地址:https://www.cnblogs.com/Duriyya/p/5588244.html