创建基础Model触发TypeError:构造函数参数实例不匹配求助
解决构造函数参数类型不匹配的TypeError问题
这个错误很典型——就是命名空间搞混了导致的类型不匹配。咱们拆解一下:
你的App\Models\Model类构造函数要求传入的是App\Models\Database的实例,但你从$app->getDb()拿到的是App\Database的实例。虽然两个类都叫Database,但它们的命名空间不一样,在PHP眼里就是完全不同的类,所以才会抛出这个TypeError。
修复步骤很简单:
只需要在你的Model类里,明确指定要使用的是App命名空间下的Database类就行,有两种方式:
方式1:用use语句引入正确的类
修改App\Models\Model.php的代码,在命名空间声明后加上use App\Database;:
<?php namespace App\Models; // 引入App命名空间下的Database类 use App\Database; class Model{ protected $db; protected $table; public function __construct(Database $db){ $this->db = $db; } public function query($statement, $attributes= null){ return $this->db->query($statement); } }
方式2:在参数里写完整的命名空间
如果不想用use语句,也可以直接在构造函数的参数类型里写完整的命名空间路径:
<?php namespace App\Models; class Model{ protected $db; protected $table; // 直接指定完整命名空间的Database类 public function __construct(\App\Database $db){ $this->db = $db; } public function query($statement, $attributes= null){ return $this->db->query($statement); } }
为什么这样能解决问题?
原来的Database $db在App\Models命名空间下,PHP会自动去App\Models目录找Database类,但你的实际Database类在App根命名空间下,所以必须明确告诉PHP你要的是哪个命名空间下的Database,这样类型检查就能通过了。
内容的提问来源于stack exchange,提问作者tokhy2000
相关产品推荐
相关产品推荐

