CodeIgniter 4 在构造器中声明model报未定义变量错误如何解决
问题修复方案
错误原因
你代码中的报错是PHP语法使用错误:在给类属性赋值时,$this->后额外多加了$符号,PHP会将$this->$komikModel识别为可变变量调用,尝试读取当前作用域下的$komikModel变量值作为属性名,而构造函数中没有定义该变量,因此抛出未定义变量错误。
直接修复方法
把构造函数里赋值语句的第二个$删掉即可,修正后的代码如下:
public function __construct() { // 去掉属性名前的$ $this->komikModel = new KomikModel(); }
修正后完整的控制器代码:
<?php namespace App\Controllers; use App\Models\KomikModel; class Komik extends BaseController { protected $komikModel; public function __construct() { $this->komikModel = new KomikModel(); } public function index() { $komik = $this->komikModel->findAll(); $data = [ 'title' => 'Daftar Komik', 'komik' => $komik, ]; return view('komik/index', $data); } }
更优的CodeIgniter 4原生实现方案
CodeIgniter 4内置了模型自动加载能力,不需要手动编写构造函数初始化模型,推荐使用以下两种方案:
方案1:使用控制器的$models属性自动加载
直接在控制器中声明$models属性,框架会自动完成模型实例化,无需手动写构造函数:
<?php namespace App\Controllers; use App\Models\KomikModel; class Komik extends BaseController { // 配置需要自动加载的模型,键名为调用时的属性名 protected $models = [ 'komikModel' => KomikModel::class ]; public function index() { // 直接调用自动初始化的komikModel属性即可 $komik = $this->komikModel->findAll(); $data = [ 'title' => 'Daftar Komik', 'komik' => $komik, ]; return view('komik/index', $data); } }
方案2:公共模型放到BaseController全局复用
如果多个控制器都需要用到KomikModel,可以直接在父类BaseController中初始化,所有继承BaseController的控制器都可以直接调用:
- 打开
app/Controllers/BaseController.php,添加模型声明:
// 在BaseController的属性中添加 protected $komikModel; // 在BaseController的initController方法中初始化 public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) { parent::initController($request, $response, $logger); $this->komikModel = new \App\Models\KomikModel(); }
- 之后所有继承BaseController的控制器都可以直接调用
$this->komikModel,无需重复初始化。
内容的提问来源于stack exchange,提问作者Zixvy
相关产品推荐
相关产品推荐

