Конструктор класса в PHP и его перегрузка

В версии PHP 5 мы получили возможность использовать конструктор класса, специальную функцию, объявляемую в классе, которая служит для инициализации экземпляра объекта. К сожалению, конструкторы, как и остальные методы класса в PHP, не могут быть «перегружены». Как это обойти, далее в статье.

Конструктор класса в PHP.

Конструктор объявляется как метод класса с именем __construct(). Он может содержать произвольное число параметров, и предназначен, прежде всего, для инициализации свойств создаваемого экземпляра объекта.

Пример функции-конструктора.

Иногда классу требуется объявить несколько разных конструкторов. Здесь можно применять разные подходы, весь перечень их ограничен лишь вашей фантазией. Я покажу вам несколько вариантов.

Перегрузка конструктора класса в PHP.

В таких языках как Си, перегрузка возможна за счет типизации входных параметров. Компилятор может отличить несколько функции с разными множествами вх. параметров (по количеству и по типу). В PHP мы объявляем только имя переменной, с которой функции может быть передано что угодно. Да и число параметров при вызове функции может быть иным, так устроен PHP.

Но мы можем анализировать актуальное число параметров, их тип, и запускать нужные ветки инициализации. Так мы получим нужный конструктор класса.

Смотрим соответствующие примеры.

Разное число параметров.

Если конструкторы должны отличаться только числом параметров, то это может выглядеть вот так:

В комментариях онлайн версии документации на php.net видел пример, где множественный выбор заменяют на вызов соответствующих методов класса.

Разные типы входных параметров.

PHP отличает скаляр от массива, массив от объекта и объекты разных типов.

Использование статических методов.

Это более универсальный подход. Мне он нравится тем, что мы можем использовать «говорящие» названия методов, создавая объект тем или иным способом. Легче читать программу, когда в названии вызываемой функции содержится дополнительная информация. Не нужно обращать внимание на число входных параметров и держать в голове типы этих переменных.

Так вы объявляете необходимое кол-во статических методов и используете их как конструкторы класса.

Использование дочерних классов.

Перегрузка внутри класса не доступна, но мы можем перегружать конструктор в дочерних классах. Перегрузить можно только public методы. Конструктор родителя вызывается с префиксом parent::.

Мне этот подход не нравится, потому что приходится плодить дочерние классы только для того, чтобы добавить ещё один конструктор. Но такая техника пригодится в более сложных случаях.

P.S.

Вариаций действительно много, что говорит о гибкости PHP. Приведенные примеры могут подтолкнуть вас придумать ещё один, лично только вам подходящий способ.

Написать комментарий

Мало букафф? Читайте есчо !

Восстанавливаем объект из состояния __PHP_Incomplete_Class_Name

Декабрь 13, 2014 г.

Объект класса "__PHP_Incomplete_Class" с дополнительным свойством __PHP_Incomplete_Class_Name => 'имя класса' появляется, когда PHP не удается найти объявление класса при операции десериализации объекта. К примеру, такое может происходить при хранении ...

Читать

Удаление элементов из массива в PHP

Ноябрь 11, 2015 г.

Массивы в PHP - один из мощнейших инструментов программиста. Когда я начинал изучать PHP, у меня был определенный багаж знаний работы с массивами в других языках программирования, таких как C++, Delphi и Fortrain. Везде требовалось объявить массив, указать ...

Читать

 

Комментарии к «Конструктор класса в PHP и его перегрузка»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий:

Много комментариев в “Конструктор класса в PHP и его перегрузка”

  1. Dmitriy Torin:

    Спасибо! полезная статья.

  2. Александр:

    Вот за это спасибо!!! Вы позволили мне не потерять время.

  3. Юрик:

    Статья отличная. Я не знаю ООП, но не сдается ли вам, что такие «трюки» говорят об урезанности ООП в PHP и в итоге это выливается в говнокод (ни в коем случае не критикую автора, просто философствую) ?

    • Нет:

      Наговнокодить можно и на Джава

    • PHP довольно специфичный язык, со своей узкой нишей применения, и он развивается именно исходя из этого. А итоговое качество кода — это субъективное понятие, которое может применятся к любым языкам.