Я открыл для себя PHP, когда мне было 16 лет. Это был первый язык, который я использовал для реального программирования. В то время я использовал его для оценки форм, отправленных пользователями, и отправки электронных писем, в основном форм «свяжитесь с нами». На протяжении многих лет я всегда считал PHP своей сильной стороной, и я всегда следил за тем, чтобы я постоянно расширял свои знания и навыки в области PHP. Не думаю, что я мастер PHP, но это язык, который я знаю лучше всего. В прошлом у меня была возможность работать с Ruby, JAVA, Python и NodeJS для малых и средних проектов. Этот опыт позволил мне увидеть, как PHP сравнивается с другими языками программирования, лучше использовать его сильные стороны и защищаться от его слабых сторон.

6 месяцев назад я присоединился к MessageBird в качестве инженера. Я подал заявку на PHP, но мало знал, что после адаптации я начну работать с GoLang, полностью уйдя от PHP. Это был потрясающий опыт, я выучил новый язык программирования за это время, и теперь я возвращаюсь к PHP, имея с собой 6 месяцев опыта программирования в GO.

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

Статический против динамического

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

Подпрограммы против параллельной обработки

Одна из самых удивительных возможностей GoLang - это горутина. Это позволяет запускать функции асинхронно. В PHP нет ничего похожего на простоту и легкость горутин. Всякий раз, когда вам нужно выполнять параллельную обработку в PHP, вам необходимо добавить внешние механизмы очередей (Beanstalk, RabbitMQ и т. Д.). Это усложняет архитектуру инфраструктуры и увеличивает сложность вашего проекта.

GoLang - победитель параллельной обработки.

Возможности ООП

Концепция ООП существует с момента изобретения программирования. Это стало доминирующей парадигмой в 90-х годах, когда методы стали широко доступны в C ++. Больше всего мне нравится в ООП то, что оно позволяет инженерам создавать карту бизнес-логики с помощью кода. Это оказывается бесценным при внесении изменений в развивающиеся системы. И PHP, и GoLang предоставляют возможности ООП, однако между этими двумя языками есть существенные различия.

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

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

Тестирование

Я думаю, что наиболее важным фактором, определяющим качество проекта, является тестирование - модульное тестирование, интеграционное тестирование, функциональное тестирование, тестирование пользовательского интерфейса, тестирование производительности - чем больше их у вас есть для вашего проекта, тем лучше качество ваших результатов. И GO, и PHP имеют отличные фреймворки для модульного тестирования - Go имеет встроенный пакет тестирования, а PHP имеет PHPUnit, оба из которых предоставляют богатый набор функций для тестирования вашего кода. PHPUnit имеет больше возможностей, чем пакет тестирования GoLang, и это потому, что PHP имеет больше возможностей. Оба инструмента выполняют свою работу для своего языка программирования. Однако при переходе к расширенному тестированию PHP и Go демонстрируют существенные различия.

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

Во-вторых, для расширенных методов тестирования, таких как BDD, TDD и A / B-тестирование, PHP имеет больше поддержки, больше библиотек на выбор и большее сообщество. Например, Cucumber (или Gherkin) имеет реализацию для обоих языков, но PHP с его реализацией BEHAT поддерживает более 40 языков, он построен с нуля на независимых компонентах и ​​имеет большую поддержку на GitHub, чем Cucumber (больше вилок, больше звезд и т. д.)

Наконец, для функционального тестирования или тестирования пользовательского интерфейса PHP имеет больше библиотек и лучшую поддержку существующих инструментов. Selenium имеет отличную поддержку PHP (3000+ кроссбраузерных тестов, запись видео, текстовые и визуальные журналы и т. Д.), В то время как для Go есть только неподдерживаемый драйвер - tebeka / selenium (последний коммит 5 месяцев назад на дату этого поста) .

Прочие отличия

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

  • GoLang имеет лучшую производительность, чем PHP. Существуют сотни тестов, которые тестируют PHP и GoLang в различных ситуациях, и по большинству из них GoLang - явный победитель. Вдобавок ко всему, во время разработки создается ощущение, что Go работает быстрее - тесты выполняются быстрее, память используется более эффективно, загрузка ЦП ниже.
  • Сообщество PHP превосходит GoLang, и его поддержка потрясающая. Я видел, как в GoLang использовались некоторые плохие вещи, такие как генераторы кода, вещи, которые PHP-сообщество оставило позади много лет назад.
  • Обслуживание пакетов тоже сильно отличается. В GoLang это внутреннее управление, в то время как в PHP есть два уровня с разными реализациями - во-первых, уровень расширений PHP, а во-вторых, уровень библиотек, для которого все используют композитор. Для PHP это более сложно, в то время как go управляет двумя уровнями в одном.

Последние мысли

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

С PHP кажется естественным разрабатывать растущие приложения, ориентированные на сложную бизнес-логику, которые используют возможности ООП и поддержку сообщества.