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

[控制器] CI框架为什么使用不了$this->_CI = &get_instance()

[复制链接]
发表于 2017-4-24 09:23:07 | 显示全部楼层 |阅读模式
我在CI框架中的libraries目录下创建了自己的一个php文件,但是浏览器报错
class Demo {

    protected $CI;

    function __construct() {
        $CI = & get_instance();
        $CI->load->library('session');
//        var_dump($CI->load->library('form_validation'));
//        exit;
        $CI->load->model('employee_model', 'user');
        $CI->load->model('employee_role_model', 'user_role');
        $CI->load->model('role_model', 'role');
    }

    public function login($login_name, $password) {
        $data['login_name'] = $login_name;
        $data['password'] = $password;

        $user_info = $CI->user->getBy($data);

        //判断用户账号是否匹配
        if ($user_info) {
            if (date('Y-m-d H:i:s', time()) >= $user_info->employee_id) {
                //写会话
                if ($this->do_login($user_info->employee_id)) {
                    //登录成功
                    return 1;
                }
            }

            //已被禁用
            return 2;
        }

        //账号或者密码不匹配(最多5次)
        if ($CI->session->has_userdata('count') == 5) {
            //更新最后登录时间
            $login_info['time_bun'] = date('Y-m-d H:i:s', time() + 7200);
            $CI->user->update($user_info->employee_id, $login_info);
        }
        $count = $CI->session->has_userdata('count') + 1;
        $CI->session->set_userdata('count', $count);
        return 0;
    }

    public function do_login($user_id) {

        //获取用户信息

        $user_info = $CI->user->get($user_id);

        //判断用户是否已经被禁用
        if ($user_info->is_bun) {
            return FALSE;
        }

        //写会话信息
        $user_role = $CI->user_role->getBy(['employee_id' => $user_id]);
        $sess_data = array(
            'user_id' => $user_info->employee_id,
            'name' => $user_info->name,
            'role_id' => $user_role->role_id,
        );

        //set session
        $CI->session->set_userdata('user', $sess_data);

        //更新最后登录时间
        $login_info['last_logedin'] = date('Y-m-d H:i:s');
        $CI->user->update($user_id, $login_info);

        //记录登录日志
        $CI->load->model('login_stamp_model', 'login_stamp');
        $login_stamp = array(
            'employee_id' => $user_id,
            'time' => date('Y-m-d H:i:s'),
            'ip' => $CI->input->ip_address(),
        );
        $CI->login_stamp->insert($login_stamp);

        return TRUE;
    }

}


报错:
Fatal error: Class 'CI_Demo' not found in D:\AppServ\www\phpcms\system\core\Common.php on line 196
A PHP Error was encountered

Severity: Error

Message: Class 'CI_Demo' not found

Filename: core/Common.php

Line Number: 196

Backtrace:
发表于 2017-4-25 17:18:17 | 显示全部楼层

PHP复制代码
class Demo {
 
    protected $CI;
 
    function __construct() {
        $CI = & get_instance();
        $CI->load->library('session');
//        var_dump($CI->load->library('form_validation'));
//        exit;
        $CI->load->model('employee_model', 'user');
        $CI->load->model('employee_role_model', 'user_role');
        $CI->load->model('role_model', 'role');
    }
复制代码



第一个问题:
__construct()  中的$CI是变量

protected $CI;
中的$CI是Demo类的属性。使用时必须是 $this->CI ,而不能$CI;
这个你上面也说了,报错的原因不是因为$this->CI用不了,而是。。。见第二个问题。


第二个问题:
PHP复制代码
 
Fatal error: Class 'CI_Demo' not found in D:\AppServ\www\phpcms\system\core\Common.php on line 196
A PHP Error was encountered
 
Severity: Error
 
Message: Class 'CI_Demo' not found
 
Filename: core/Common.php
 
Line Number: 196
 
Backtrace:
 
复制代码

报错内容已经说得明明白白了。
你把你application下的core文件列表出来;
把 application/config/autoload.php 中 libraries的展示出来。
另外,我记得类名好像不能定义为CI_XXX的吧?自己写的不需要,扩展的要用MY_
 楼主| 发表于 2017-4-25 21:36:38 | 显示全部楼层
class Demo {
    protected $CI;
    public function __construct() {
        $this->CI = &get_instance();
        $this->CI->load->library('session');
        $this->CI->load->model('employee_model', 'user');
        $this->CI->load->model('employee_role_model', 'user_role');
        $this->CI->load->model('role_model', 'role');
    }
}
您说的是我应该这样写吗?我也是接触CI框架时间不长所以对他的原理还不大清楚。
但是那个CI_Demo不是我自己定义的类,我定义的是类是Demo,前面的CI是CI框架中system文件里的一个报错机制自动加的
发表于 2017-4-27 14:41:05 | 显示全部楼层
ab12130604 发表于 2017-4-26 22:25
您说的情况我刚试了,但还是不行。被这个问题困扰好几天了

那需要用排查法来检查:
1.在不调用demo类的情况下系统能否运行。
2.再创建一个新的自定义类,并加载看是否还会出现类似的报错
3.你的这个demo类所在文件名是什么?注意报错的提示是“CI_Demo”也就是说CI搜索的类是CI_Demo.php文件
如果你的文件名确实是CI_Demo.php那么你的类名也应该叫 class CI_Demo { .... },如下:
11111222222.png

在linux环境下一定要注意文件名大小写问题,因为我在WINDOWS和MAC环境下发现CI会忽略文件名大小写,更新到linux环境下CI就找不到文件了

发表于 2017-4-24 14:40:32 | 显示全部楼层
你应该 $this->CI 这样来使用类的属性,类的属性不是普通的变量,建议仔细学习下 PHP 语法。
 楼主| 发表于 2017-4-25 10:04:20 | 显示全部楼层
Hex 发表于 2017-4-24 14:40
你应该 $this->CI 这样来使用类的属性,类的属性不是普通的变量,建议仔细学习下 PHP 语法。 ...

一开始是用$this->CI写的但也是不行,总是报同一个错误。&get_instance()好像是没起到作用
发表于 2017-4-25 10:39:28 | 显示全部楼层
ab12130604 发表于 2017-4-25 10:04
一开始是用$this->CI写的但也是不行,总是报同一个错误。&get_instance()好像是没起到作用 ...

报什么错?截图看一下,这肯定是需要 $this->_CI 的
 楼主| 发表于 2017-4-25 16:08:04 | 显示全部楼层
Fatal error: Class 'CI_Demo' not found in D:\AppServ\www\phpcms\system\core\Common.php on line 196
A PHP Error was encountered

Severity: Error

Message: Class 'CI_Demo' not found

Filename: core/Common.php

Line Number: 196

Backtrace:
这就是报错的内容
发表于 2017-4-26 11:28:35 | 显示全部楼层
ab12130604 发表于 2017-4-25 21:36
class Demo {
    protected $CI;
    public function __construct() {

控制器都要继承于 CI_Controller 这个父类,建议先仔细看一下手册,不能按照你自己以为的方式写代码啊,CI 有很多规矩,不是这么简单的。
 楼主| 发表于 2017-4-26 11:36:09 | 显示全部楼层
恩,多谢您的宝贵意见
发表于 2017-4-26 17:58:59 | 显示全部楼层
楼主,根据你贴的ERROR,我觉得是不是你在控制器里没有加载你写的这个类。
建议你试试:
1.在application/config/autoload.php 里直接通过配置 $autoload['libraries'] = array("Demo");

2.在你的控制器里通过$this->load->library("Demo") 看看

当你未告诉框架加载这个类,直接使用这个类的话,框架会以为这个是一个系统自带类,就跑到croe里按CI的规则去找这个类,因此就会出现

Message: Class 'CI_Demo' not found

实际上你的框架中并没有CI_Demo这个类,只有一个Demo类而已

本版积分规则