givemetwo 发表于 2015-11-18 18:03:37

当控制器名称和方法名相同时出现的问题

本帖最后由 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');
    }
}


将正确输出如下结果

















仙芋 发表于 2015-11-20 22:52:13

这么巧,我今天也碰到这种问题。把公共函数里面的代码全都注释掉了,居然还会报错,不知道的真的以为见鬼了!在两个函数分别ECHO一句话,去访问任意一个函数代表的路径,居然都两个函数的ECHO都会出来,后来才发现公共函数的名字不能和所在类的名字一样!:L:L:L

Hex 发表于 2015-11-23 11:06:21

与类名相同的方法是构造函数,这个是一个基本的 PHP 的语法结构,所以这个是要避免的。这个跟 CI 无关。
页: [1]
查看完整版本: 当控制器名称和方法名相同时出现的问题