首页 > Web开发 > 详细

ThinkPHP框架基础知识二

时间:2016-06-18 14:08:23      阅读:115      评论:0      收藏:0      [点我收藏+]

一、空操作和空控制器处理

 空操作:没有指定的操作方法;空控制器:没有指定控制器,例如:

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中方法可以实现:

  • new的方式造对象,然后调用ShuChu方法
  • 使用A方法快速创建对象,相当于new的方式,比较方便,推荐使用
  • 使用R方法,不仅可以造对象,还能调用方法

 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)

 注意:命名空间使用的是反斜杠 \

 

技术分享

ThinkPHP框架基础知识二

原文:http://www.cnblogs.com/xinghun/p/5593572.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!