针对空操作的问题
找父类的配置文件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类有没有造成。