zoukankan      html  css  js  c++  java
  • 空控制器空操作

    针对空操作的问题

    找父类的配置文件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 AdminController;
    use ThinkController;
    
    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 AdminController;
    use ThinkController;
    
    class MainController extends Controller
    { 
        public function index(){
            echo "欢迎使用ThinkPHP";
        }
        //调用该控制器下的某个操作方法
        public function test(){
            //造另外一个控制器对象的方法A();方法
            $l = A("Login");     //用来快速创建控制器的对象
            $l->login();
        }
        
    }

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

    <?php
    namespace AdminController;
    use ThinkController;
    
    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      像Homecontroller

     

    用命名空间怎么用: use

      从根开始写,写到类名为止           像ThinkController     (用这个父类文件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  HomelibsDBDA();          //这样就新建了一个DBDA类的对象。

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

  • 相关阅读:
    Java第9次作业--接口及接口回调
    Java第8次作业--继承
    软件工程第三次作业——关于软件质量保障初探
    Java第7次作业--访问权限、对象使用
    Java第6次作业--static关键字、对象
    Java第5次作业--对象的创建与使用
    20194629 自动生成四则运算题第一版报告
    软件工程第一次作业
    今天开通博客啦!
    1170. Compare Strings by Frequency of the Smallest Character
  • 原文地址:https://www.cnblogs.com/shandayuan/p/7422885.html
Copyright © 2011-2022 走看看