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

[已解决] 请教下关于controller的继承

[复制链接]
发表于 2008-2-22 16:26:30 | 显示全部楼层 |阅读模式
刚刚接触CI几天,对于php也是新手。大家尽情拍砖。
看了手册create core classes一章里面System List里面有Cotroller,但是和别的比如Input等不一样,在library里面他并不是以CI_ 开头(有啥区别啊?),而且我试着试用MY_Controller,发现它并不能被控制类给继承。
现在我的想法是有 UserControllerBase 和 AdminControllerBase两者都继承Controller,然后别的控制类继承UserControllerBase或者AdminControllerBase。恩要达到这样的效果。

而且在CI里,我到现在还是不会实现继承,library中调用别的library类。不知道怎么实现,手册已经翻烂了。Model也不会继承。
55555~~
发表于 2008-2-22 16:35:57 | 显示全部楼层
我自己继承过 Model,是可以的。控制器还没有,应该可以吧?贴出你的代码看看。
 楼主| 发表于 2008-2-22 16:43:59 | 显示全部楼层
<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
        class MY_Controller extends Controller{
               
                function MY_Controller(){
                        parent::Controller();
                }
               
                function test(){
                        return "this is MY Controller";
                }
        }
?>
就这样吧,控制器类调用test方法,报错说没有这个方法,我之前试了Email,起作用的。
站长大哥你还没有回答我的很多问题呢。
1,为嘛Controller和Model不加前缀CI_
2,即使Controller可以实现继承,他能否被两个不同类给继承,然后控制器类有可随便选择这两个中的一个来继承
3,library类里面我想调用其他library类该如何实现?难道用include
发表于 2008-2-22 16:44:09 | 显示全部楼层
PHP复制代码
<?php
class Base extends Controller {
        function __construct(){
                parent::Controller();
        }
}
 
class Basic extends Base {
        function __construct(){
                parent::__construct();
        }
}
复制代码

我是这样继承的,很正常呀:)
 楼主| 发表于 2008-2-22 16:46:57 | 显示全部楼层

回复 4楼 的帖子

这样肯定不是best practice吧
而且我别的文件中类的想要继承上面的Base类,该如何呢?
发表于 2008-2-23 10:43:46 | 显示全部楼层
 楼主| 发表于 2008-2-29 11:57:12 | 显示全部楼层
谢谢楼上的各位
问题差不多有了答案
关于继承框架本身应该没有提供类似功能(我觉得这点太土了,不知道别的诸如Cake等有没有) ,php5提供的__autoload方法大体上可以解决这个问题
library中调用model或者其他library 可以调用get_instance这个全局的方法在去load

ok,继续学习
发表于 2008-3-19 16:27:46 | 显示全部楼层
我不知道你有什么答案了,你的问题还是你自己了解,而且好像遇到了很大的问题似的。
在application/libraries/目录下建立一个文件叫做MY_Controller.php
PHP复制代码
 
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class UserController extends Controller {
        function UserController() {
                parent::Controller();
        }
}
 
class AdminController extends Controller {
        function AdminController() {
                parent::Controller();
        }
}
?>
 
复制代码

在application/controllers/目录下建立test.php
PHP复制代码
 
<?php
class Test extends AdminController {
        /*
        function Test() {
                parent::AdminController();
        }
        */

        function index()
        {
                $data['name'] = 'shooray';
                $this->smartyextended->view('test', $data);
        }
}
?>
 
复制代码


你看我这里还用了Smarty(这是我定制过了的,已经加到autoload.php),刷新页面,显示正常。不过需要注意的是,如果你不想在Test的构造函数里做什么事情,就最好不要写构造函数,像我那样注释掉,否则就得手动调用parent::AdminController();
这就是重载,我觉得CI挺好的,不需要什么__autoload,CI的问题是没有IDE支持,智能输入和调试。。。

[ 本帖最后由 shooray 于 2008-3-19 16:31 编辑 ]
发表于 2010-5-18 23:37:24 | 显示全部楼层
奇怪了, 我始终不行
发表于 2010-5-18 23:42:06 | 显示全部楼层
回复 9# Midnight


    为什么不行,报什么错?

本版积分规则