Как писать код для WordPress без классов? Только функциональный ООП?

ReactJS отказался от классов 3-4 года назад, назвав такой подход сложным и дорогим. Вот решил написать плагин для WordPress тоже без классов, но с ОПП.

Это все в тему того что ООП это не только классы. Классы это лишь подтип ООП.

Но 99% программистов уверены что ООП без классов не бывает.

Можно ли писать ООП в PHP & WP только на функциях и хуках?

Классы путают и людей, и машины

Именно так звучит заголовок мотивации в ReactJS, в котором они описывают причины отказа от классов и переход в функции и хуки.

Подробнее тут.

А можно ли так делать в WordPress?

Именно так как у ReactJS & JS на 100% — нельзя из-за ограничений PHP. Но в 90% случаев это реально.

Можно писать ООП, инкапсуляцию, наследование, полиморфизм, переиспользование кода и все ключевые идеи ООП — но без классов, только с функциями.

Отличие лишь в том что у JS есть прототипы и они позволяют делать много чего нельзя в PHP.

Однако я долго сомневался и решил попробовать…

Написать плагин для WP с достаточно сложным функционалом, но без классов, только функции, хуки и неймспейсы.

В общем код тут https://github.com/uptimizt/feditor

Суть решения очень простая:

  • инкапсуляция на базе неймспейсов
  • наследование через хуки — легко допилить функционал как тебе надо — не трогая основной код
  • переиспользование — легко брать базу и допиливать ее под свои цели

И все это без классов.

ООП есть. Классов нет. Магия!

Плюсы и минусы

Если в JS такое может работать почти везде, то в PHP ограничений больше.

  • Такой подход не сработает если мне нужно управлять состоянием внутри запроса. В этом случае мне придется писать класс. Но такого тут пока нет и не предвидится.
  • Еще один кейс — это MVC и конкретно модели — В JS можно такое делать без классов, в PHP без классов такое написать никак нельзя.

Также приходится перестроить свой мозг из SOLID в GRASP — разный фундамент мышления — для многих программистов это сложно.

Но если говорить о плюсах:

  • код пишется быстрее — меньше кода
  • он легче читается — если кто то решит доработать логику под себя
  • меньше зацепленности — такой подход требует использовать хуки — а значит фаталов будет меньше
  • лучше позднее связывание — можно поменять почти все что угодно под себя и свои задачи
Фото аватара
Antony I

Веб разработчик, специализация на лучших мировых практиках: WordPress, WooCommerce, NextJS, Strapi, JAMStack ...

Основные типы проектов: CMS, eCommerce, SEO, LMS, ECM, BPM

Подробнее...

Статей: 125

Один комментарий

  1. По пунктам:

    0) «Можно писать ООП, инкапсуляцию, наследование, полиморфизм, пере использование кода и все ключевые идеи ООП — но без классов, только с функциями.»
    — не в посте не в демке на гитхабе не показан пример не полиморфизма и наследования, но возможность есть, допустим

    1) «Отличие лишь в том что у JS есть прототипы и они позволяют делать много чего нельзя в PHP.»
    — прототип это порождающий шаблон проектирования как известно не вижу проблемы добавить его если нужно куда-либо.

    2) «Еще один кейс — это MVC и конкретно модели — В JS можно такое делать без классов, в PHP без классов такое написать никак нельзя.»
    — ок, а как этому парню (https://habr.com/ru/sandbox/113470/) в песочнице хабра удалось это осуществить, либо врёт, либо MVC можно реализовать в любом тьюринге полном языке программирования как минимум, так что как то можно выходит.

    3) «код пишется быстрее — меньше кода»

    И того передать колбек дабы выбраться функцию из неймспейса, судя по примеру в гитхабе нужно написать всего-то
    __NAMESPACE__ . ‘\\function_name’
    тогда как вызвать метод класса можно не указывая неймспейса
    [$this, function_name] кажется короче не правда ли?
    Но это все мелочи не писать class или new не такое большое преимущество, чтобы читать весь этот пост и даже комментарий.

    Но даже это не предел, если не использовать префикс функций вместо неймспесов и вызывать глобальные функции одной строкой ‘prefix_function_name’ зачем тогда писать неймспейсы если можно обойтись без них

    Касательно хуков, они могут присутствовать в разных парадигмах программирования. Объекты судя по тому что есть в гитхабе никаких не создается, ибо объект это как минимум такой тип данных который имеет поля и методы, да объекты можно реализовать даже без использования классов в php, но едва ли это будет эффективнеее нативных объектов.
    Так как объектов нет то нет и полиморфизма, нельзя иметь общие методы объектов если объекты отсутствуют.
    В демке код максимально конкретный, абстракции никакой нет.

    По итогу мы имеем несколько функций объединенных в несколько разных неймспейсов, немспейсы крайне интерсный иструмент языка, по при всем желании демка на демонстрацию новой парадигмы не тянет.

    И того что мы имеем в остатке, некоторый эвентлуп в котором реализованы колбеки, плюс пространства имен, при этом никакие переменные используемые во всем этом коде не могут иметь типов кроме примитивных (для создания кастомных типов без классов не обойтись).

    Можно реализовать все преимущества ооп без использования ключевого слова class и даже выдумать реализацию создания объектов отличный от классов способом как и сделать из буханки троллейбус, но как известно незачем ввиду встроенной в язык поддержке

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *