我有這些類的實例檢查在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