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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

P.S.

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

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

Работаем с датами широкого диапазона в PHP

Январь 28, 2016 г.

Многие не задумываются при работе в PHP со стандартными функциями даты-времени о диапазоне их применимости (date(), time(), mktime() и т.п). Так мы можем скоро столкнуться с проблемой, подобная которой случалась уже раньше - "ошибка 2000". Я прекрасно ...

Читать

Раздвигающееся вертикальное меню Drupal 6

Сентябрь 7, 2013 г.

Эта задача из разряда useability. Drupal может штатно создавать блоки вертикальных иерархических меню. Неудобным будет тот случай, когда мы хотим попасть на страницу в глубине иерархии этого меню. Нам придется последовательно заходить на родительские ...

Читать

Получение превью (картинки) для видео vimeo

Август 23, 2019 г.

Рассмотрим как получить thumbnail для видео vimeo, если у вас есть только url видоса. Vimeo позволяет извлечь мета информацию о видео, используя video id. Потому мы сначала выделим id, а потом выполним запрос к API Vimeo за дополнительной информацией, ...

Читать

Отправить PUT запрос через cUrl в PHP

Май 19, 2021 г.

Делюсь примером кода, который отправляет PUT запрос через CURL. Все работает точно также как для POST запроса, с небольшими отличиями в настройках: [crayon-69c3b458f4139972923526/] Надеюсь, этот пример сэкономит вам время :)

Читать
 

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

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



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

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

  1. Dmitriy Torin:

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

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

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

  3. Юрик:

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

    • Нет:

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

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