проверьте в php, является ли объект экземпляром класса, но не экземпляром подкласса

1

У меня есть эти классы

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, все в порядке

new b(new el(new db ()));

Но если я создаю экземпляр класса ca получил ошибку

new c(new el(new db ()));

PHP Catchable fatal error: аргумент 1, переданный в :: __ construct(), должен быть экземпляром db, экземпляр el

Что я должен сделать, чтобы решить ситуацию:

  • Форсировать класс c конструктор для вызова класса конструктор. Но как?
  • В классе b конструктор решает из аргумента правильный способ вызова класса конструктором.
  • В конструкторе класса b решайте, будет ли он непосредственно создаваться или из расширенного класса c, и используйте правильный способ вызова класса конструктор.
  • 2
    Почему el не расширяет дБ?
  • 0
    Это пример, в реальном случае: db - класс соединения с базой данных; el (универсальный) объект, который использует соединение БД, но не расширяет его; а является агентским субъектом (расширяет эл); б является кладбищенским объектом (таким образом расширяется агентство); с является юридическим лицом (так расширяется агентство).
Показать ещё 1 комментарий
Теги:
oop
constructor

1 ответ

0
Лучший ответ

Используя get_class($this) в конструкторе класса B, вы сможете отличить от вызова родительского конструктора с C или прямого вызова.

См. Http://php.net/manual/en/function.get-class.php, пример № 2.

Iansus.

  • 0
    Спасибо, я применил ваше решение таким образом, что класс b расширяет {public function construct ($ db) {// parent :: __ construct ($ db); if (get_class ($ this) == __CLASS ) {parent :: __ construct ($ db); } else {parent :: __ construct ($ db-> db); }}}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню