ab12130604 发表于 2017-4-24 09:23:07

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

我在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:

Skiy 发表于 2017-4-25 17:18:17


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用不了,而是。。。见第二个问题。


第二个问题:

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_

ab12130604 发表于 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文件里的一个报错机制自动加的

jadexo 发表于 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 { .... },如下:


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

Hex 发表于 2017-4-24 14:40:32

你应该 $this->CI 这样来使用类的属性,类的属性不是普通的变量,建议仔细学习下 PHP 语法。

ab12130604 发表于 2017-4-25 10:04:20

Hex 发表于 2017-4-24 14:40
你应该 $this->CI 这样来使用类的属性,类的属性不是普通的变量,建议仔细学习下 PHP 语法。 ...

一开始是用$this->CI写的但也是不行,总是报同一个错误。&get_instance()好像是没起到作用

Hex 发表于 2017-4-25 10:39:28

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

报什么错?截图看一下,这肯定是需要 $this->_CI 的

ab12130604 发表于 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:
这就是报错的内容

Hex 发表于 2017-4-26 11:28:35

ab12130604 发表于 2017-4-25 21:36
class Demo {
    protected $CI;
    public function __construct() {


控制器都要继承于 CI_Controller 这个父类,建议先仔细看一下手册,不能按照你自己以为的方式写代码啊,CI 有很多规矩,不是这么简单的。

ab12130604 发表于 2017-4-26 11:36:09

恩,多谢您的宝贵意见:handshake

jadexo 发表于 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类而已
页: [1] 2
查看完整版本: CI框架为什么使用不了$this->_CI = &get_instance()