空控制器空操作

针对空操作的问题

找父类的配置文件Controller.class.php的类配置文件。

在thinkphp的Library的Think文件夹里有个Controller.class.php文件里面搜索__call的魔术方法

如果有不存在的操作的时候就执行这个配置文件里的这个方法。

 

    E(L('_ERROR_ACTION_').':'.ACTION_NAME);代表如下图的输出结果

 

如果说我们让这个if走了前两个中的任何一个,上面这个错误页面就不会显示了

所以可以在要访问的控制器里面定义一个_empty操作方法让用户可以不会看到错误页面来防止泄露信息

在要访问的控制器类里面定义好了_empty方法后,如果你的操作不存在的话它就会自动调用这个_empty方法来执行。

这样定义一个_empty操作方法:

 

所以说解决这个空操作的这个问题,实际上就是要在我们自己的控制器里边写一个_empty方法,然后在这_empty方法里面提示一些错误信息

如果在真正用的过程中,把_empty操作方法做一个对应的模板文件出来。这个模板文件做一个静态的就可以,里面做的漂亮一些,然后给出

一个错误提示来,这样就更加好看一些了。不是只给出一句话。

所以说针对以后在做TP程序的时候,首先把空操作解决了。也就是说在写控制器的时候额外再加一个_empty方法出来。把这个空操作的问题解决掉

 

屏蔽当访问空控制器的方法

 

当访问空控制器时显示的页面如下:

 

错误位置是显示在Think文件夹里面的App.class.php文件中。

 

针对访问一个不存在的控制器怎么来处理掉?

 

在Home的Controller文件夹里面新建一个EmptyController.class.php(控制器)

新建出了这个控制器,我们就可以直接在访问不存在的控制器的时候就可以直接调它了。然后在这个类里面给出

一个提示来。如下图

这个就是针对于这个TP框架里面的空操作和空控制器的一个处理

也可以在Application文件夹里面创建一个新的模块admin文件夹模块

里面还要创建若干文件夹如下图:

 

再在Controller里面可以创建控制器类文件LoginController.class.php

怎么在不同控制器里面调用不同的操作方法?

 

当在同一个模块相同控制器里面调用其他的操作方法时:

<?php
namespace Admin\Controller;
use Think\Controller;

class MainController extends Controller
{ 
    public function index(){
        echo "欢迎使用ThinkPHP";
    }
    //调用该控制器下的某个操作方法
    public function test(){
        $this->index();         //this代表该对象
    }
    
}

页面访问地址为 localhost/0306/thinkphp/index.php/Admin/Main/test

当在同一模块不同控制器里面调用操作方法:

<?php
namespace Admin\Controller;
use Think\Controller;

class MainController extends Controller
{ 
    public function index(){
        echo "欢迎使用ThinkPHP";
    }
    //调用该控制器下的某个操作方法
    public function test(){
        //造另外一个控制器对象的方法A();方法
        $l = A("Login");     //用来快速创建控制器的对象
        $l->login();
    }
    
}

当在不同模块下时调用操作方法:

<?php
namespace Admin\Controller;
use Think\Controller;

class MainController extends Controller{ 
    public function index(){
        echo "欢迎使用ThinkPHP";
    }
    //调用该控制器下的某个操作方法
    public function test(){
        //跨模块调用操作方法
        //直接在A方法里面写控制器名称等于造个当前模块的对象,因为是调不同模块里的操作方法,
        //所以需要造一个属于即将想要调的操作方法里的模块的对象才行。需要在A方法里面写上
        //即将要调的模块名和它里面的控制器名。
        $m = A("Home/Main");     
        $m->mains();
    }
}

 只要是TP框架里面出现的类文件,无论是什么样的类文件,都必须要加命名空间,如果不加命名空间,那么这个类就没法使用。

 

 

 

命名空间:相当于虚拟目录。

目的:是为了自动加载类。

初始命名空间就把它当作是路径里面的根目录一样。   就是Library文件夹

根命名空间:

  根命名空间是包含在初始命名空间下面的。

  第一部分:Library下面的所有文件夹。

  第二部分:应用程序模块名   像(Home文件夹  Admin文件夹)

TP框架下所有的类都要写命名空间

写命名空间怎么写:

  从根开始写,写到该文件所在的目录为止。   像Think/Db      像Home\controller

 

用命名空间怎么用: use

  从根开始写,写到类名为止           像Think\Controller     (用这个父类文件controller.class.php)

 

不使用use的情况下,怎么使用命名空间:

  例(将DBDA.class.php拿到TP框架里面来用)

  这个DBDA.class.php类文件可以拿到哪个地方文件夹里来用?

这个类是我们要使用的,要使用就必须写命名空间(namespace),写命名空间就必须从根开始写的,那么这个DBDA类就要扔在根下面了。

(所以说使用第三方类扔进来后一定是扔在根命名空间里面的。第一部分可以扔,第二部分也可以扔。)

 

第三方类只要拿到TP框架里面来用就必须遵循TP规则。必须是类名.class.php然后文件夹里面的类名和文件里面的名称一定要一致,不能一个大写一个小写

要保持一致。

拿进来之后要给它定一个命名空间不然没法用  如下图:

定义好命名空间之后就可以使用这个类了。使用方法如下图:

其中:

  初始命名空间相当于路径里面的根。所以这个\(反斜杠)就代表初始命名空间。因为/(正斜杠)代表根目录嘛。

  所以\(反斜杠)代表初始命名空间。初始命名空间(就是Library)下面有根。而DBDA.class.php在哪个文件夹下面?

  是在Home下面有个libs文件夹再找到DBDA这个类

  所以写法是:

        $db = new  \Home\libs\DBDA();          //这样就新建了一个DBDA类的对象。

         echo $db->dbname;        //输出一下看这个DBDA类有没有造成。

 

posted @ 2017-08-24 14:30  mengqiaini  阅读(333)  评论(0编辑  收藏  举报