В марте 2012 года был анонсирован релиз PHP 5.4. В этой версии должно было появиться множество интересных нововведений, так что разработчики ждали его с нетерпением. Пожалуй самой ожидаемой особенностью стали типажи. Еще до релиза, Shameer C написал замечательный обзор возможностей, которые дают нам типажи в PHP. Я настоятельно рекомендую вам ознакомиться с этой статьей, так как моя статья предполагает наличие у вас базовых знаний по типажам и понимание их работы.
Сообщество разработчиков PHP приняло типажи, в основном потому, что они уже были реализованы в других популярных языках программирования, например Java, C++ и Phython. Кроме того, преимущества типажей были хорошо разрекламированы разработчиками, которые вставляли свои пять копеек, касательно того, как типажи помогут улучшить любой проект, особенно как замена наследования. Но так ли хороши типажи на самом деле? Помогут ли они повысить уровень PHP разработчиков, или же это просто очередная причуда?
Типажи в PHP это плохо
Добавление типажей в основном мотивировалась тем, что их использование поможет уменьшить дублирование кода. Так же, они могут упростить поддержку кода, сделать его чище.
Большинство разработчиков, безусловно приветствовало такую возможность, однако многие ведущие разработчики опасались, что типажи будут использоваться не по назначению. Одним из таких разработчиков является Энтони Феррара, опасения которого развились настолько, что он провозгласил типажи следующей наиболее злоупотребляемой особенностью языка, наряду с eval и константами. Но перед тем как Энтони сделал столь резкие выводы, он привел очень интересный довод: типажи на самом деле являются коллекцией примесей, которые практически не имеют состояния. Реализация типажей в PHP позволяет им иметь состояния, так что по сути типажи в PHP это примеси. Из этого простого факта возникает вопрос об истинной цели введения типажей в PHP. Нет никаких объяснений того, почему типажи обрабатываются как обычные примеси, а не как примеси без состояний, какими они в конечном счете и должны быть.
Энтони продолжает, заявляя, что типажи схожи по функциональности с тем, что позволяет нам делать ключевое слово extends для связи двух классов вместе. Так как эта возможность языка является хорошо известной и используется на протяжении долгого времени, то возникает вопрос, действительно ли типажам есть место в PHP или же это попытка прыгнуть выше головы?
Так же возникает вопрос касательно интерфейсов. Многие разработчики имеют лишь смутное представление о различиях между типажами и интерфейсами; вы можете повторно использовать как типажи так и интерфейсы, так же, как и в случае с инетфейсами, вы можете наследовать типажи друг от друга. Являются ли типажи чем то новым для PHP, или же это просто обновленные интерфейсы?
Типажи в PHP это хорошо
Несмотря на поднятые вопросы, типажи это хорошо для PHP. Они позволяют нам реализовать множественное наследование (как известно ключевое слово extends позволяет реализовать только одиночное наследование).
Одиночное наследование используется вот уже много лет, и оно стало неотъемлемой частью объектно ориентированного программирования в PHP. Оно ограничивало разработчиков в создании сложных структур, если они хотели сохранить код чистым и не избыточным. В других языках множественное наследование может быть использовано для уменьшения дублирования кода в таких ситуациях. Но в PHP нету множественного наследования. Вместо этого были предложены интерфейсы, но они не предназначены для подобного применения.
Интерфейсы должны действовать как контракт, обязывающий любой класс реализовывать необходимый функционал. Они могут помочь обеспечить связь между классами, но интерфейсы не являются заменой множественному наследованию.
Несколько разработчиков попытались создать решения для множественного наследования в PHP, но большинство из этих попыток слишком избыточны, и больше похожи на эксперименты, чем на настоящее решение.
При помощи типажей, напротив, множественное наследование может быть реализовано. Как показал Shameer в своей статьей по использованию типажей, вы можете использовать несколько типажей внутри класса. Джон Сквиб в своем примере использования типажей 2011-ого года использовал несколько типажей для реализации множественного наследования.
Большинство программистов считают множественное наследования злом, указывая на "проблему ромба", и утверждают что одиночное наследование доставляет меньше головной боли. Но дело то не в том, что непрактично использовать множественное наследование в PHP, а в том, что такая возможность существует. В свете множества публичных высказываний против PHP, это становится особенно важным. В качестве подтверждения просто загуглите «Не используйте PHP». С появлением возможности использования множественного наследования, PHP стал более вызывающим, дорогим и приемлемым языком программирования, а не только «самым распространенным WEB языком». Я нахожу это довольно утешительным фактом, когда разработчики, использующие C++, Java или Python, пытаются принизить PHP в силу слабой поддержки языком стандартных методов программирования.
Типажи являются достаточно ярким свидетельством того, что PHP медленно но уверенно становится языком, который будет охватывать все больше и больше стандартных техник программирования, который, надеюсь, привлечет еще больше хороших разработчиков.
Заключение
Типажи позволяют PHP разработчикам создавать более чистый, простой и эффективный код, а так же позволяет создавать более сложные системы а так же экспериментировать с ними.
Они не хороши, они замечательны! Они открывают новый уровень в техники разработки ООП для PHP разработчиков, и я верю, что это предзнаменование будущего PHP.
Если вы хотите ознакомиться с темами, упомянутыми в этой статье, в том числе углубить свои знания о типажах, предлагаю следующий список статей:
- Ircmaxell’s Blog: Are Traits The New Eval?
- John Squibb’s Programming Blog: Multiple Inheritance in PHP 5.4 using Traits
- AzonMedia: Multiple Inheritance in PHP – a Workaround
- Refulz PHP: Traits in PHP 5.4 – Why we need Traits
- Christer’s Blog o’Fun: Playing with Traits in PHP 5.4alpha1
- Slideshare: PHP Traits, Treat or Threat?
- Refulz PHP: Traits in PHP – Multiple and Nested Traits
От переводчика: замечания по переводу прошу присылать в личку.
Автор: Fesor