2015-11-13 70 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

相关问题