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:
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_
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文件里的一个报错机制自动加的 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就找不到文件了
你应该 $this->CI 这样来使用类的属性,类的属性不是普通的变量,建议仔细学习下 PHP 语法。 Hex 发表于 2017-4-24 14:40
你应该 $this->CI 这样来使用类的属性,类的属性不是普通的变量,建议仔细学习下 PHP 语法。 ...
一开始是用$this->CI写的但也是不行,总是报同一个错误。&get_instance()好像是没起到作用 ab12130604 发表于 2017-4-25 10:04
一开始是用$this->CI写的但也是不行,总是报同一个错误。&get_instance()好像是没起到作用 ...
报什么错?截图看一下,这肯定是需要 $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:
这就是报错的内容 ab12130604 发表于 2017-4-25 21:36
class Demo {
protected $CI;
public function __construct() {
控制器都要继承于 CI_Controller 这个父类,建议先仔细看一下手册,不能按照你自己以为的方式写代码啊,CI 有很多规矩,不是这么简单的。 恩,多谢您的宝贵意见:handshake 楼主,根据你贴的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