peear 发表于 2010-1-19 03:27:14

扩展Controller类后找不到新类的原因浅见

以下结果只在本地单机测试成功,如有不足请指正。

本人在扩展Controller类的时候也遇到了无法找到新类的问题,错误代码类似于:
Fatal error:Class 'MY_Base' not found in D:\wamp\www\CodeIgniter\system\application\controllers\main.php on line 3

文件名是MY_Base.php(application\libraries目录下),测试扩展代码如下:

<?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Base extends Controller {

    function MY_Base()
    {
      parent::Controller();
      echo "base";
    }
}
?>

然后普通控制器继承自MY_Base:

class Main extends MY_Base{

    function Main()
    {
      parent::MY_Base();   
    }


    function index()
    {
      $this->load->view('main_index');
    }
}

    结果出现之前所述错误,无法找到MY_Base类,论坛内有仁兄提到用用户文档中演示的MY_Controller扩展原始Controller类并用MY_Controller命名文件和新类名的时候可以正常显示,经过测试确实可以正常扩展并继承新类。但是换成其他名字都出错。

    随后我想到ci在搜索类的时候应当是首先根据名称搜索该名称的文件,进而搜索文件内的类,但是只有这样还是无法正常扩展。文档中提到用MY_Controller命名的文件内写入新类来扩展原来的Controller,‘MY_’是前缀,‘Controller’是被扩展的类名,然后文件内的类继承自Controller,然后本人只修改了文件内的类名而斗胆未按照ci中规定的控制器创建方法去用类名命名文件。

    然后就产生了一个这样的文件:

文件名是:'MY_Controller.php',而文件内容是:

<?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Base extends Controller {

    function MY_Base()
    {
      parent::Controller();
      echo "base";
    }
}

?>

    然后普通控制器继承自‘MY_Base’,结果终于没有了'Fatal error',并正确打印了扩展类中的“base”字符串,控制器视图也同样调用正常。

    既然到了这一步,索性把扩展类'MY_Base'中的前缀'MY_'去掉,只是 'Base extends Controller',结果大家应该能猜到,没有出错没有异常,正常输出......-_-!   (原来...是这样......~_~)

    如果不出意外,看到这里后大家应该清楚了如何正确的去扩展核心类了,如有不足请多多指正。


    最后罗嗦两句,config.php里面的子类前缀'MY_'的实际意义就只是跟文件相关了

visvoy 发表于 2010-1-19 08:22:12

原因详见system/CodeIgniter/common.php的function load_class()源码
CI类加载函数只检测文件,不检测类名是否存在

peear 发表于 2010-1-19 13:43:50

:L--:L
   受教
页: [1]
查看完整版本: 扩展Controller类后找不到新类的原因浅见