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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

P.S.

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

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

Создание файла на Google Drive через API

Ноябрь 10, 2023 г.

Работа с API гугл - это ещё та головоломка, тут переплетены и вечно обновляемые версии API, не прозрачные процедуры авторизации и запутанная консоль разработчика. ...

Читать

Читаем курсы валют, реализация для drupal

Декабрь 5, 2012 г.

Как я писал ранее, хороший информ-сервис, это не куча вариантов виджетов для вашего сайта, а, в наиболее ценном случае, возможность грузить данные информ-сервиса в виде xml. В развитом случае, это целый API для разработчика, с возможностью выборки данных ...

Читать

Измеряем скорость работы кода в PHP

Сентябрь 15, 2017 г.

Чтобы измерить скорость работы кода нужны две вещи - "код" и секундомер. Программный код у вас есть, а секундомер, оформленный в виде класса - можете взять здесь. Очень простой, основанный на функции microtime(), секундомер скрывает рутину по сохранению ...

Читать

Обмен данных Angular с бек-энд на PHP

Ноябрь 11, 2016 г.

Стоит ли рассказывать, что Ангуляр при всей своей прелести лишь одна сторона медали - frontend, который как то должен взаимодействовать со второй половинкой ...

Читать
 

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

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



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

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

  1. Dmitriy Torin:

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

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

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

  3. Юрик:

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

    • Нет:

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

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