2015-11-13 63 views
1

我有這些類的實例檢查在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中使用正確的方法來調用類的構造函數。
+2

爲什麼el不擴展db? –

+0

這是一個例子,在真實情況下: db是數據庫連接類; el是一個(通用)實體,它使用db連接但不擴展它; a是一個機構實體(所以擴展el); b是一個墓地實體(所以延伸機構); c是一個客廳實體(所以擴展代理)。 – caiofior

+0

如果用完全不同的類型覆蓋構造函數,那麼您不應該調用父構造函數。很明顯,這可能會有點混亂,所以真正的答案是保持你的類型簡單,沒有很多重載和改變子類中的類型。您需要創建一個更加健全的OO模型,其中包含聲音類型;你現在看起來像隨機拼湊。 – deceze

回答

0

在B類構造函數中使用get_class($this),您將能夠區別於從C調用父構造函數或直接調用。

參見:http://php.net/manual/en/function.get-class.php,實施例#2。

Iansus。

+0

謝謝,我以這種方式應用了您的解決方案。 class b擴展了公共函數__construct($ db){parent :: __ construct($ db);如果(get_class($ this)== __CLASS__){ parent :: __ construct($ db);其他{ parent :: __ construct($ db-> db); } } } – caiofior

相關問題