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

[版本 3.x] CI钩子里为什么使用不了$this->_CI = &get_instance();

[复制链接]
发表于 2015-10-2 19:53:29 | 显示全部楼层 |阅读模式
<?php
class Myclass{
         private $url_model;//所访问的模块,如:music  
     private $url_method;//所访问的方法,如:create
         private $CI;
        function __construct(){

                 $this->_CI = &get_instance();

               
        }
        public function Myfunction($params){
                        var_dump($this->_CI->load->library('session'));
                        /* var_dump($this->CI); */
/*                         var_dump(class_exists("CI_Controller")); */
                /* $this->_CI = &get_instance();
                var_dump($this->CI->router->class); *//* $this->_CI->load->view("welcome_message"); */
                /* var_dump($this->CI); */
                /* echo BASEPATH.'core/Controller.php'; */
        }
}
?>


前端打印出来的
Fatal error: Call to a member function view() on a non-object in F:\wamps\www\CodeIgniter2\admin\application\hooks\Myclass.php on line 13
那个函数和类确实已经加载了。为什么这个实例 就是没用
求高手解答

发表于 2016-3-25 16:45:23 | 显示全部楼层
解决了吗,我现在也碰到这个问题
发表于 2016-5-6 14:43:36 | 显示全部楼层
你使用的HOOK是什么,不同阶段,可能使用不了CI这个变量的。只有在post_controller_constructor之后才可以使用。
发表于 2016-5-6 18:34:41 | 显示全部楼层
CI中设定了7个钩子,钩子与钩子之间相对独立。
前3个钩子是在实例化之前设定的,意味着无法使用get_instance实例,要使用已实例化的类需要global。
7个钩子的作用手册上说的比较清楚了,具体说明如下:
1、pre_system 在系统执行的早期调用,这个时候只有 基准测试类 和 钩子类 被加载了, 还没有执行到路由或其他的流程。
2、pre_controller 在你的控制器调用之前执行,所有的基础类都已加载,路由和安全检查也已经完成。
3、post_controller_constructor 在你的控制器实例化之后立即执行,控制器的任何方法都还尚未调用。
4、post_controller 在你的控制器完全运行结束时执行。
5、display_override 覆盖 _display() 方法,该方法用于在系统执行结束时向浏览器发送最终的页面结果。 这可以让你有自己的显示页面的方法。注意你可能需要使用 $this->CI =& get_instance() 方法来获取 CI 超级对象,以及使用 $this->CI->output->get_output() 方法来 获取最终的显示数据。
6、cache_override 使用你自己的方法来替代 输出类 中的 _display_cache() 方法,这让你有自己的缓存显示机制。
7、post_system 在最终的页面发送到浏览器之后、在系统的最后期被调用。


发表于 2016-5-10 10:54:09 | 显示全部楼层
haohailuo 发表于 2016-5-6 18:34
CI中设定了7个钩子,钩子与钩子之间相对独立。
前3个钩子是在实例化之前设定的,意味着无法使用get_instanc ...

本版积分规则