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

Подведение итогов. Просмотрите предыдущую статью и код.





Глядя на класс Lamborghini, это просто пустой класс, который расширяет Car. Класс Car содержит конструктор.

Мы можем создать экземпляр класса и использовать родительский конструктор без указания конструктора внутри класса Lamborghini.

Вызов метода get_year_make_and_model() дает Lamborghini Diablo SV 1999 года. Это означает, что на самом деле был вызван родительский конструктор, который установил свойства $year, $make, и $model.

Что, если бы у класса Lamborghini был конструктор? Конструктор Lamborghini также принимает 3 аргумента: марка, модель и цвет. На этот раз мы не собираемся проводить год.

Теперь мы можем попробовать некоторый тестовый код и посмотреть, работает ли он.

И, конечно же, это так. Вы можете подумать, что этого не должно быть, учитывая, что мы никогда не передавали год родительскому конструктору. Поскольку мы вызываем конструктор Lamborghini, родительский конструктор никогда не вызывается.

Но что, если мы хотим вызвать родительский конструктор и установить год, используя конструктор Lamborghini?

На этот раз мы изменим конструктор, чтобы он принимал 4 аргумента: $year, $make, $model,и $secret_code. Почему $secret_code? Потому что его нет в классе Car. Это свойство будет существовать внутри класса Lamborghini. Это облегчит понимание кода.

public function construct($year, $make, $model, $secret_code) { }

Мы можем установить свойства $year, $make и $model, используя ключевое слово $this, или мы можем проявить фантазию и использовать родительский конструктор. . Как мы вызываем родительский конструктор из дочернего конструктора?

parent::__construct()

Теперь он устанавливает $secret_code внутри класса Lamborghini и вызывает конструктор Car для установки остальных трех свойств.

Давайте добавим методы получения/установки для свойства $secret_code, чтобы мы могли провести дополнительное тестирование.

Выполнение кода дает нам результат, который мы искали: 1999 Lamborghini Diablo SV 0x4225sdf4.

И последнее, на что следует обратить внимание, — это позиция вызова родительского конструктора. В то время как другие объектно-ориентированные языки программирования требуют, чтобы вы сначала вызывали родительский конструктор, в PHP вы можете вызвать его в любое время внутри конструктора. Следующий код также будет работать.

Я по-прежнему предпочитаю немедленно вызывать родительский конструктор, а затем выполнять любой дополнительный код в конструкторе дочернего класса на тот случай, если PHP передумает в будущем.



Дино Кайич в настоящее время является руководителем отдела информационных технологий в компаниях LSBio (LifeSpan BioSciences, Inc.), Absolute Antibody, Kerafast, Everest BioTech, Nordic MUbio и Exalpha. Он также является генеральным директором MyAutoSystem. Он имеет более чем десятилетний опыт разработки программного обеспечения. У него есть B.S. в области компьютерных наук и несовершеннолетнего в области биологии. Его опыт включает в себя создание приложений для электронной коммерции на уровне предприятия, разработку программного обеспечения на основе исследований и содействие распространению знаний посредством письма.

Вы можете связаться с ним в LinkedIn, подписаться на него в Instagram, подписаться на его блог или подписаться на его публикацию на Medium.

Прочитайте все истории Дино Каджика (и тысяч других авторов на Medium). Ваш членский взнос напрямую поддерживает Дино Кайича и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.