我有这些类的实例检查在PHP如果对象是一个类的实例,但不是一个子类别
class db {
}
class el {
public function __construct (db $db) {
$this->db = $db;
}
}
class a {
public function __construct (db $db) {
}
}
class b extends a {
public function __construct ($db) {
parent::__construct($db);
}
}
class c extends b {
public function __construct ($db) {
parent::__construct($db);
}
}
如果我实例B类万事OK
new b(new el(new db()));
但如果我实例类CA得到一个错误
new c(new el(new db()));
PHP Catchable fatal error: Argument 1 passed to a::__construct() must be an instance of db, instance of el given
我该怎么做才能解决这种情况:
- 强制类c构造函数调用类的构造函数。但是如何?
- 在b类构造函数中,从参数中决定调用类构造函数的正确方法。
- 在b类构造函数中决定是直接实例化还是从扩展类c中使用正确的方法来调用类的构造函数。
为什么el不扩展db? –
这是一个例子,在真实情况下: db是数据库连接类; el是一个(通用)实体,它使用db连接但不扩展它; a是一个机构实体(所以扩展el); b是一个墓地实体(所以延伸机构); c是一个客厅实体(所以扩展代理)。 – caiofior
如果用完全不同的类型覆盖构造函数,那么您不应该调用父构造函数。很明显,这可能会有点混乱,所以真正的答案是保持你的类型简单,没有很多重载和改变子类中的类型。您需要创建一个更加健全的OO模型,其中包含声音类型;你现在看起来像随机拼凑。 – deceze