一、空操作和空控制器处理
空操作:没有指定的操作方法;空控制器:没有指定控制器,例如:
http://网址/index.php/Home/Main/login 正常
http://网址/index.php/Home/Main/hello 空操作(hello方法不存在)
http://网址/index.php/Home/beijing/login 空控制器(beijing控制器不存在)
1、空操作:
一般网站处于安全考虑不给用户提示任何错误信息
“空操作”本质意思:一个对象(控制器)调用本身不存在的方法
在OOP里边,对象调用本身不存在方法,处于用户体验比较好的角度考虑,我们可以在类里边制作一个魔术方法:function __call();
在tp里面控制器的父类:/tp/ThinkPHP/Library/Think/Controller.class.php,其中有个方法:
所以空操作有两种解决方案:
(1) 在对应的控制器里边制作一个方法,名称为”_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用)不要在父类中建,要在子类中建。
function _empty() { echo "<h1>网页不存在,请检查浏览器地址信息!</h1>"; }
这样在访问该控制器下空操作时:
(2) 给空操作制作一个同名的模板出来,系统会自动调用,例如:Home/Main/hello.html
<body> <h1>别乱访问!</h1> </body>
这样在访问该空操作时:
但是这种方法仅限于这一个空操作,若是访问别的空操作,还是会有错误信息,由于空操作的不确定性,所以不推荐使用,知道这种方法就行。
2、空控制器
空控制器:在实例化控制器对象的时候,没有找到指定的类。
在ThinkPHP/Library/Think/App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容:
空控制器处理方案:可以再制作一个控制器:Home/Controller/EmptyController.class.php
在该控制器内部其实只需要制作一个_empty()方法即可:
<?php namespace Home\Controller; use Think\Controller; class EmptyController extends Controller { function _empty() { echo "<h1>访问的页面不存在!</h1>"; } }
这样再次请求:
二、跨控制器调用方法
例如:在Main控制器里面调用Index控制器中的ShuChu方法
Index控制器:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function ShuChu() { return "教务管理系统"; } }
控制器是一个类,要调用里面的方法,先要实例化对象,再通过对象去调用方法,这里有3中方法可以实现:
Main控制器:
<?php namespace Home\Controller; use Think\Controller; class MainController extends Controller { function ShuChu() { //跨控制器访问操作(方法) 因为控制器都是类,所以可以实例化对象来调用里面的方法 //1. //造对象 $index = new IndexController(); //调用方法 echo $index->ShuChu(); //2. //使用A方法来快速创建对象 $index = A("Index"); echo $index->ShuChu(); //3. //使用R方法,造对象,并且调用某一个特定的方法 echo R("Index/ShuChu"); } }
这样请求Main控制器中ShuChu方法:
三、跨模块调用
原来有一个Home模块,我们按照Home模块的规则新建一个Admin模块,里面的文件夹与Home模块一样:在JiaoWu/下新建Admin文件夹,在Admin/下新建五个文件夹:Controller/,Model/,View/,Common/,Conf/。在Controller/下新建TestController.class.php:
<?php namespace Admin\Controller; use Think\Controller; class TestController extends Controller { public function Test() { return "Admin模块操作"; } }
在Home/Main/ShuChu下调用Admin/Test/下的Test方法,只需在创建对象时前面加上模块名即可:
<?php namespace Home\Controller; use Think\Controller; class MainController extends Controller { function ShuChu() { //跨模块调用方法 //使用A方法 $test = A("Admin/Test"); echo $test->Test(); //使用R方法 echo R("Admin/Test/Test"); } }
这样访问ShuChu方法:
四、命名空间的定义及使用
我们正常管理文件使用文件夹,这是物理区分;
而命名空间相当于一个虚拟目录,虽然不在同一个文件夹下,但在虚拟目录下仍然属于同一类
TP框架的初始命名空间是:ThinkPHP/Library
在TP框架下的命名空间里面使用\代表的是初始命名空间(ThinkPHP\Library)
1.系统目录下根命名空间是以ThinkPHP/Library下面的文件夹名称,如:Think,Org
2.模块的根命名空间是以模块名命名的,如:Home,Admin
在定义命名空间的时候要从根写起,例如:namespace Home\Controller; namespace Think\Model;
如果要使用某个类文件,引入该类命名空间的时候,使用use关键字,后面写该类的命名空间,后面加上“\文件名”,例如:use Think\Controller就是引入Think下的Controller.class.php类文件。
如果不想引入命名空间,在造类的对象的时候,可以使用\(初始命名空间)来找到对应的类,例如:new \Think\Page(30)
注意:命名空间使用的是反斜杠 \
原文:http://www.cnblogs.com/xinghun/p/5593572.html