当控制器名称和方法名相同时出现的问题
本帖最后由 givemetwo 于 2015-11-18 18:21 编辑问题描述:
当控制器类中有与控制名称相同的方法时,总是会先执行与控制器名称相同的方法,然后执行你所访问的方法。并且忽略掉控制器所继承的类
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Demo extends CI_Controller {
public function demo(){
echo 111;
}
public function demo1(){
echo 'xxx';
}
public function demo2(){
$this->load->view('welcome_message');
}
}
当访问 http://domain/demo/demo 时
会先执行与控制器名称相同的方法demo 然后执行执行你所访问的方法demo
输出 111111
当访问 http://domain/demo/demo1 时
会先执行与控制器名称相同的方法demo 然后执行执行你所访问的方法demo1
输出 111xxx
当访问 http://domain/demo/demo2 时
会先执行与控制器名称相同的方法demo 然后执行执行你所访问的方法demo2
因为会忽略掉控制器所继承的类 所以输出类似如下的错误
同理分析Index控制器,index方法的问题
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Index extends CI_Controller {public function index(){
echo 111;
}
}
如果默认控制器是 Index当访问域名时 会默认路由到Index控制器的Index方法
根据上面的分析会执行两次index方法输出111111
好了不BB了
解决方案1:
控制器内不要写与控制器名称相同的方法
解决方案2:
控制器内添加构造方法
代码如下:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Index extends CI_Controller {
public function __construct(){
parent::__construct();
}
public function index(){
echo 111;
$this->load->view('welcome_message');
}
}
将正确输出如下结果
这么巧,我今天也碰到这种问题。把公共函数里面的代码全都注释掉了,居然还会报错,不知道的真的以为见鬼了!在两个函数分别ECHO一句话,去访问任意一个函数代表的路径,居然都两个函数的ECHO都会出来,后来才发现公共函数的名字不能和所在类的名字一样!:L:L:L 与类名相同的方法是构造函数,这个是一个基本的 PHP 的语法结构,所以这个是要避免的。这个跟 CI 无关。
页:
[1]