CI 1.7 控制器必须知道的问题
我只看了Base5.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 CI 确实是单例模式,这毫无疑问,全局只允许有一个控制器,不存在 new 很多控制器的情况。
扩展 HMVC 属于另外的问题,并且,new 的是一个模块,而不是控制器。 举个例子,
我想弄一个头部导航条,当然这只是个例子,导航条一般不这么用,但是有些功能可能这么用比较好
导航条我这么来弄,写个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不出对象。 楼上的想法不错,不过这就像楼上说的,可能会造成混乱,这就是为什么 CI 的类库都不会从控制器继承的原因。
页:
[1]