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

[控制器] CI 1.7 控制器必须知道的问题

[复制链接]
发表于 2011-1-21 20:12:13 | 显示全部楼层 |阅读模式
我只看了Base5.php
代码比较简单
PHP复制代码
class CI_Base {
 
        private static $instance;
 
        public function CI_Base()
        {
                self::$instance =& $this;
        }
 
        public static function &get_instance()
        {
                return self::$instance;
        }
}
 
function &get_instance()
{
        return CI_Base::get_instance();
}
复制代码


以前总以为是单例模式,仔细看了一下不是,如果想根据控制器扩展一些东西的话可要注意了(比如扩展HMVC)
每new一个控制器然后调用 get_instance()就会返回不同的控制器
例:
随便找个action
$this->a='aaa';
$ci= &get_instance();
echo $ci->a;
exit;
输出aaa

$this->a='aaa';
$n=new Controller();
$n->a='ccc';
$ci= &get_instance();
echo $ci->a;
exit;
输出ccc
发表于 2011-1-21 21:08:26 | 显示全部楼层
CI 确实是单例模式,这毫无疑问,全局只允许有一个控制器,不存在 new 很多控制器的情况。
扩展 HMVC 属于另外的问题,并且,new 的是一个模块,而不是控制器。
 楼主| 发表于 2011-1-23 16:42:36 | 显示全部楼层
举个例子,
我想弄一个头部导航条,当然这只是个例子,导航条一般不这么用,但是有些功能可能这么用比较好
导航条我这么来弄,写个library
class Nav extends Controller{
        function nav(){
                parent::Controller();
        }
       
        function get_nav(){
                $data=array();
                .....
                return $this->load->view('someview',$data);
        }
}

然后在主控制器中可以得到导航条
$this->load->library('nav');
$nav_str=$this->nav->get_nav();


补充:
这么做有这么几个特点
1.不必使用万能的&get_instance()
2.这个控制器和主控制器是并行的,级别上没有大小之分
3.这个控制器和主控制器的唯一区别就是不会自动被调用
但是这要注意一个问题了,$this->load->library('nav');一旦调用&get_instance()指向的对象就变了,如果在这之后不用这个函数就没有问题。
单例模式new不出对象。
发表于 2011-1-23 20:44:49 | 显示全部楼层
楼上的想法不错,不过这就像楼上说的,可能会造成混乱,这就是为什么 CI 的类库都不会从控制器继承的原因。

本版积分规则