用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5317|回复: 2
收起左侧

[讨论/交流] 扩展Controller类后找不到新类的原因浅见

[复制链接]
发表于 2010-1-19 03:27:14 | 显示全部楼层 |阅读模式
以下结果只在本地单机测试成功,如有不足请指正。

本人在扩展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目录下),测试扩展代码如下:

<?php  if ( ! 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',而文件内容是:

<?php  if ( ! 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_'的实际意义就只是跟文件相关了

发表于 2010-1-19 08:22:12 | 显示全部楼层
原因详见system/CodeIgniter/common.php的function load_class()源码
CI类加载函数只检测文件,不检测类名是否存在
 楼主| 发表于 2010-1-19 13:43:50 | 显示全部楼层
--
   受教

本版积分规则