УДК 004

Сравнительный анализ реализации объектно-ориентированного подхода на языках JavaScript и PHP

Мавлянов Азизбек Нажот Угли – магистрант факультета Программной инженерии и компьютерной техники Национального исследовательского университета ИТМО.

Аннотация: В статье отражён сравнительный анализ объектно-ориентированного подхода на языках JavaScript и PHP. Критериями сравнительного анализа являются частота использования объектно-ориентированных конструкций и модель реализации объектно-ориентированного подхода. В результате сравнительного анализа были выявлены как аналогичные, так и противоположные особенности реализации объектно-ориентированного подхода на рассматриваемых языках программирования.

Ключевые слова: объектно-ориентированный подход, сравнительный анализ, модель реализации, частота использования.

На настоящем этапе высокие требования предъявляются к внутренней языковой мобильности разработчиков в составе фулл-стэк команд, что обусловливает актуальность данной работы, посвящённой объединяющим и различающим чертам имплементации объектно-ориентированного подхода в JavaScript и PHP.

Целью настоящей работы является сравнительный анализ реализации объектно-ориентированного подхода к программированию на языках JavaScript и PHP, позволяющий разработчикам свободнее ориентироваться в кодовой базе при переходе от одной экосистемы к другой.

Выделим модели реализации объектно-ориентированного подхода, на основе которых можно провести сравнительный анализ относительно PHP и JavaScript:

  • Прототипная модель
  • Модель на основе классов

ООП на языке JavaScript реализуется с помощью прототипной модели, которая не содержит как таковые классы, а имитирует поведение класса, расширяя существующие объекты (прототипы) [1]. Данное утверждение может быть обосновано на примере, который показан на Рисунке 1. На данным примере представлен процесс создания объектов «Audi», «Nissan», «Volvo» и их наследования от вышестоящих объектов посредством прототипной цепочки. Нижнюю ступень цепочки занимают объекты «Audi», «Nissan», «Volvo», чьи свойства «__proto__» равны прототипу («Car.prototype») функции-конструктора «Car». Следовательно, все свойства зарегистрированные в «Car.prototype» доступны всем трем объектам («Audi», «Nissan», «Volvo»). Свойство «__proto__» функции-конструктора «Car» равно прототипу («Function.prototype») глобальной функции «Function». Следовательно, все свойства зарегистрированные в «Function.prototype» доступны функции-конструктора «Car». Свойство «__proto__» глобальной функции «Function» не равно «Object.prototype», который является прототипным объектом объекта «Object», встроенного в ядро JavaScript. Каждый объект в JavaScript является экземпляром объекта «Object», следовательно наследует все его свойства и методы. В данным случае глобальная функция не является исключением. Но как данная функция может получить доступ к свойствам и методам «Object», если свойство «__proto__» глобальной функции «Function» не равно «Object.prototype»? Глобальная функция «Function» получает доступ к свойствам и методам «Object» с помощью свойства «Function.prototype.__proto__», которое равно прототипу «Object.prototype» объекта «Object». Из этого примера следует, что в JavaScript ООП, который реализуется на основе прототипной модели не используются классы, а используются прототипы.

1

Рисунок 1. Иллюстрация создания объектов (экземпляров) на основе прототипной модель в JavaScript.

С другой стороны, в JavaScript версии 6 (ES6) ключевое слово «class» стало так называемым синтаксическим сахаром для создания множества объектов по прототипу.

При имплементации ООП на языке PHP используется модель, основанная на классах [5]. На Рисунке 2 представлена иллюстрация создания экземпляров (объектов) класса машины. На данным примеры классом является первая машина «Car», которая нарисована пунктирными линиями. Объектами, которые создаются на основе класса «Car» являются машины с названиями «Audi», «Nissan» и «Volvo». Эти машины закрашены в черный цвет. Из этого примера следует, что, создав один класс, можно создавать бесконечно множества объектов (экземпляров) на основе данного класса. Данный пример четко иллюстрирует взаимосвязь между классом и объектом в PHP.

2

Рисунок 2. Иллюстрация создания объектов на основе класса в PHP.

Кроме этого, для реализации ООП-подхода на языке PHP используются аспекты основных парадигм ООП:

  • Наследование
  • Инкапсуляция
  • Полиморфизм

Наследование на языке PHP реализуется на основе родительского класса, от которого наследуются и другие дочерние классы, то время как на языке JavaScript применяется наследование от конкретного объекта к конкретному объекту. В современных версиях JavaScript наследование может быть реализовано с помощью методов Object.create и Object.setPrototypeOf.

Инкапсуляция на языке PHP предполагает функционал ограничения доступа к данным и реализуется с помощью таких служебных слов как «public», «protect», «private». Данные служебные слова определяют уровень защищенности данных от внешнего воздействия. В отличие от PHP, на языке JavaScript подобный эффект достигается за счёт функции конструктора, который скрывает свою реализацию. Это позволяет ограничивать доступ к данным, которые находятся внутри тела данной функции. При этом на стадии обсуждения находятся изменения стандарта, легализующие указанные служебные слова с учётом принятой в JavaScript прототипной модели [6].

Полиморфизм в PHP – это поддержка нескольких реализаций на основе одного общего интерфейса [4]. Если сказать несколько иначе, это взаимозаменяемость объектов, реализующих один интерфейс.

Поскольку в JavaScript все методы и свойства определяются внутри свойства prototype, различные классы могут определять методы с одинаковыми именами; методы находятся в области видимости класса, в котором они определены, пока два класса не имеют связи родитель-потомок (например, один наследуется от другого в цепочке наследований) [2]. Данное утверждение характеризует функционал полиморфизма в JavaScript.

Следующим критерием, на основе которого можно провести сравнительный анализ реализации объектно-ориентрованного подхода, является частота использования объектно-ориентированных конструкций. Для этого рассматриваются популярные фреймворки и библиотеки JavaScript и PHP.

В современной экосистеме представлены такие JavaScript-библиотеки и фреймворки как React.js, Angular.js, Vue.js, Ember.js, Polymer, Aurelia, Sail.js которые реализуют объектно-ориентированные конструкции [8]. Наряду с этими инструментами существует и такие фреймворки как Express.js, Koa.js, Hapi.js, Данные фреймворки не реализует объектно-ориентированный подход, а реализует подход промежуточного программного обеспечения (middleware) [7]. Данный подход имплементируется на основе принципов функционального программирования, где используются чистые функции и функции высшего порядка, а не классы или экземпляры (объекты) данных классов.

Практически все PHP-фреймворки являются объектно-ориентированными, в отличие от JavaScript фреймворков. Например, такие популярные PHP-фреймворки как Laravel, Yii, Symfony, Phalcon, CodeIgniter, CakePHP, Zend, FuelPHP, PHPixie, Slim основываются на принципах объектно-ориентированного подхода к программированию при решении тех или иных предметных задач. 

Будучи двумя основными языками веб-разработки, JavaScript и PHP развиваются конвергентно, дополняя друг друга. PHP тяготеет к приоритету объектно-ориентированного подхода, но по мере развития обогащается функциональными чертами. Например, в PHP 7.4 введены короткие замыкания, также известные как стрелочные функции [3]. С другой стороны, в JavaScript версии 6 (ES6) ключевое слово class стало так называемым синтаксическим сахаром для создания множества объектов по прототипу.

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

Список литературы

  1. Crockford, D. JavaScript: The Good Parts, First Edition – US. – 2008 Vol. 228. – P. 92 – 115.
  2. Вступление в объектно-ориентированный JavaScript. [Электронный ресурс] Режим доступа: https://developer.mozilla.org/ru/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript (дата обращения: 07.07.2020).
  3. М.А. Кузнецов, И.Н. Симдянов PHP – Санкт-Петербург, 2018. – №1 С. 24-60.
  4. М.С. Фленов PHP глазами хакера. – Санкт-Петербург, 2018. – №3 С. 44-52.
  5. Matt, Z. PHP Objects, Patterns and Practice, Second Edition – US Computers & Education. ― 2008. ― Vol. 80. ― P. 92–115.
  6. Flanagan, D. JavaScript: The Definitive Guide, Sixth Edition – US. – 2011 Vol. 1019. – P.199 – 246.
  7. Demashov D., Gosudarev I.B. Efficiency evaluation of Node.js web-server frameworks. CEUR Workshop Proceedings. 2020. Vol. 2590. pp. 1-8.
  8. Vozisov N., Gosudarev I.B., Gotskaya I.B. Approaches towards the comparison and utilization of Javascript animation libraries // CEUR Workshop Proceedings - 2020, Vol. 2590, pp. 1-9.

Интересная статья? Поделись ей с другими: