CodeIgniter 3报错:未定义属性CI_Loader::$yamaha_model及方法调用问题
解决CodeIgniter 3中控制器调用模型方法的错误问题
先给你拆解下遇到的两个错误根源:
- 通知错误:
未定义属性:CI_Loader::$yamaha_model——$this->load是CI的加载器类实例,它本身并没有yamaha_model这个属性,直接通过$this->load->yamaha_model访问肯定会触发未定义属性的提示。 - 致命错误:
调用非对象的成员函数product()—— 既然$this->load->yamaha_model不存在(返回null),那调用它的product()方法自然就会触发这个致命错误。
你的问题核心是没正确加载模型就直接调用,而且调用模型的方式也错了。下面给你两种可行的解决方案:
方案一:在控制器中手动加载模型
在控制器的index方法开头先加载模型,再调用模型方法,修改后的控制器代码如下:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Yamaha extends CI_Controller { public function index(){ // 先加载模型,这一步是关键! $this->load->model('yamaha_model'); $template = array( 'title' => 'YAMAHA', 'heading' => 'My Heading', 'message' => 'My Message' ); // 现在可以直接通过$this->模型名来调用方法了 $contents['row'] = $this->yamaha_model->product(); $contents['cart_session'] = $this->session->userdata('cart_session'); $template['content'] = $this->load->view('yamaha',$contents,TRUE); $this->load->view('template',$template); } }
方案二:全局自动加载模型
如果这个yamaha_model在多个控制器里都会用到,你可以配置全局自动加载,省得每次都手动加载:
- 打开
application/config/autoload.php文件 - 找到
$autoload['model']这一行,把你的模型名加进去:
$autoload['model'] = array('yamaha_model');
配置完成后,你在任何控制器里都可以直接用$this->yamaha_model->product()调用方法,不需要再手动加载。
额外验证点
确保你的模型文件符合CI3的规范:
- 模型文件必须放在
application/models/目录下,文件名是Yamaha_model.php(首字母大写,Linux服务器对文件名大小写敏感,这点要注意) - 模型类名必须是
Yamaha_model,和文件名完全一致,并且正确继承了CI_Model(你的模型代码这部分是没问题的)
其实你代码里注释掉的那行$contents['row'] = $this->yamaha_model->product();是完全正确的写法,只需要补上模型加载的步骤就可以正常运行了。
内容的提问来源于stack exchange,提问作者nut webplus
相关产品推荐
相关产品推荐

