Мой профиль...

Search This Blog

Friday, November 7, 2014

PHP: конструктор по умолчанию (default constructors)

Рассмотрим следующий код:
  1. class Animal {  
  2.     protected $what = "nothing";  
  3.     function sound() {  
  4.         echo get_class($this)." says {$this->what}";   
  5.     }  
  6. }  
  7.    
  8. class Cow extends Animal {  
  9.     protected $what = "moo";  
  10.     protected $owner;  
  11.     public function __construct($owner) {  
  12.         // parent::__construct(); (?)  
  13.         $this->owner = $owner;  
  14.     }  
  15. }  
  16.    
  17. $a = new Cow("Old McDonald");  
  18. $a->sound();  
В данном коде представлена простая иерархия классов.
Теперь посмотрим на 12-ую строку кода отмеченную (?). Конечно, в данном случае мы можем не вызывать родительский конструктор, но...

Предположим, со временем мы дополнили родительский класс:
  1. class Animal {  
  2.    protected $born;  
  3.    public function __construct() {  
  4.       $this->born = time();  
  5.    }  
  6. }  
Вроде бы, мы ничего не поменяли, но теперь все наследуемые классы работают неверно, т.к. не вызывают родительский конструктор. Для того чтобы это исправить, нам нужно пройтись по всем классам потомкам и добавить вызов родительского конструктора.

Мы могли бы избежать этой проблемы, если бы придерживались простого правила: вставлять вызов родительского конструктора, даже когда он пустой. Если родительский конструктор не определен, то вызов parent::__construct() не будет делать ровным счетом ничего. Но, если мы когда либо внедрим родительский конструктор, все наши дочерние классы будут готовы.

Релевантные посты...

Related Posts with Thumbnails