1.空操作、空控制器处理
http://网址/shop/index.php/Home/User/login
http://网址/shop/index.php/Home/User/XXX 空操作
http://网址/shop/index.php/Home/XXX/xxx 空控制器
空操作:没有指定的操作方法
![非法操作](https://i-blog.csdnimg.cn/blog_migrate/cb9382e4ca6b471ecae9bf844da2d65e.jpeg)
一般网站处于安全考虑不应该给用户提示任何错误信息。
“空操作”本质意思:一个对象(控制器)调用本身不存在的方法。
在OOP中,对象调用本身不存在的方法,处于用户体验比较好的角度考虑,我们应该在类里之中一个魔术方法:function __call();
程序代码如下:
<?php
namespace Home\Controller;
use Think\Controller;
Class UserController extends Controller{
function login(){
//调用视图模板display();
$this -> display();
}
function register(){
//调用视图模板display();
$this -> display();
}
// 避免该方法被重复在各个控制器中书写,可以把该方法放到父类里
// Controller父类位置:ThinkPHP/Library/Think/Controller.class.php
function __call($m,$arg){
}
}
ThinkPHP/Library/Think/Controller.class.php中的function __call()方法
程序代码如下:
/**
* 魔术方法 有不存在的操作的时候执行
* @access public
* @param string $method 方法名
* @param array $args 参数
* @return mixed
*/
public function __call($method,$args) {
if( 0 === strcasecmp($method,ACTION_NAME.C('ACTION_SUFFIX'))) {
if(method_exists($this,'_empty')) {
// 如果定义了_empty操作 则调用
$this->_empty($method,$args);
}elseif(file_exists_case($this->view->parseTemplate())){
// 检查是否存在默认模版 如果有直接输出模版
$this->display();
}else{
E(L('_ERROR_ACTION_').':'.ACTION_NAME);
}
}else{
E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_'));
return;
}
}
快捷函数C()
C(名称):获得配置变量(convention.php、config.php)信息
C(名称,值):设置配置变量信息
快捷函数L():获得语言变量信息
快捷函数E():页面输出错误信息
在上述代码中的C()所操作的配置变量对应ThinkPHP/Conf/convention.php:
'ACTION_SUFFIX' => ' ', // 操作方法后缀
在上述代码中的L()所操作的配置变量对应ThinkPHP/Lang/zh-cn.php:
'_ERROR_ACTION_' => '非法操作',
1、从上述代码中可知会首先判断
shop/Home/Controller/UserController.class.php
类是否有_empty操作进行空操作处理。
程序代码如下:
<?php
namespace Home\Controller;
use Think\Controller;
Class UserController extends Controller{
function login(){
//调用视图模板display();
$this -> display();
}
function register(){
//调用视图模板display();
$this -> display();
}
function _empty(){
echo "<center><img src='".IMG_URL.'404.gif'."' alt=''/></center>";
}
}
然后运行http://localhost/ThinkPHP/shop/index.php/Home/User/XXX
![运行效果](https://i-blog.csdnimg.cn/blog_migrate/984065caa37282af0f1e39596661c584.jpeg)
2、从上述代码中可知如果shop/Home/Controller/UserController.class.php
类没有_empty操作进行空操作处理,则判断是否存在默认模版,如果有直接输出模版。
即在shop/Home/View/User下新建XXX.html
程序代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XXX</title>
</head>
<body>
<h1>XXX</h1>
</body>
</html>
然后运行http://localhost/ThinkPHP/shop/index.php/Home/User/XXX
![运行效果](https://i-blog.csdnimg.cn/blog_migrate/f555f1d71475d1c640d657d6b0a709a6.jpeg)
1、在对应的控制器中制作一个方法,名称为“_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用)
2、给空操作的名称制作一个同名的模板出来,系统会自动调用。
空控制器:没有指定的控制器
![无法加载控制器](https://i-blog.csdnimg.cn/blog_migrate/f30e861b831655e9a8eafd97d9f5e0f7.jpeg)
空控制器:在实例化控制器对象的时候,没有找到指定的类。
什么时候实例化控制器对象:ThinkPHP/Library/Think/App.class.php
ThinkPHP/Library/Think/ App.class.php
中的function exec()方法
程序代码如下:
……
else{
//创建控制器实例
$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);
}
if(!$module) {
if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) {
header("Content-type:image/png");
exit(base64_decode(App::logo()));
}
// 是否定义Empty控制器
$module = A('Empty');
if(!$module){
E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME);
}
}
……
快捷函数A()
A(“项目://模块/控制器”):实例化控制器对象
A(“Home/User”):实例化User控制器对象
A(“shop:// Home/User “):实例化shop项目的Home模块的User控制器对象
从上述代码中可知会首先判断shop/Home是否有Empty控制器进行空控制器处理。
即在shop/Home/Controller下新建EmptyController.class.php
程序代码如下:
<?php
namespace Home\Controller;
use Think\Controller;
Class UserController extends Controller{
function _empty(){
echo "<center><img src='".IMG_URL.'404.gif'."' alt=''/></center>";
}
}
然后运行http://localhost/ThinkPHP/shop/index.php/Home/XXX/XXX
![运行效果](https://i-blog.csdnimg.cn/blog_migrate/8fe0123965f0c0410cbacd111fcf952b.jpeg)
创建一个控制器,名为EmptyController.class.php,在该控制器内部写一个_empty()方法。
TP中一些重要文件:
index.php:入口文件
ThinkPHP/ThinkPHP.php:框架核心文件
ThinkPHP/Library/Think/Think.class.php:框架核心文件
ThinkPHP/Library/Think/App.class.php:框架应用文件
App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容。
2.项目分组设置
系统有前台界面以及后台界面。
两者在使用过程中就是对“控制器”、“视图模板”、“Model模型”的操作