Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
43 lines (42 sloc) 15.3 KB
В PHP хорошо развито ООП, на уровне Java/C#: interface, abstract class, class, implements, extends, private, public, protected
Помимо развитого ООП в PHP поддерживаются Трейты (trait), они же примеси или миксины
На PHP можно писать и в функциональном стиле, есть функции высшего порядка, замыкания, map/filter/reduce, и даже книга с описанием продвинутых техник (аппликативы, функторы, монады): "Functional Programming in PHP" http://www.functionalphp.com/
Анонимные функции появились в PHP на 5 лет раньше, чем в Java: июнь 2009 PHP 5.3 vs март 2014 Java 8
В PHP есть генераторы (ключевое слово yield) и библиотеки реализующие кооперативную многозадачность (корутины) https://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
На каждый запрос PHP очищает окружение, мы видим только заголовки и тело пришедшего запроса, нет никакого глобального состояния приложения - идеальный иммутабельный сервис для обработки http запросов!
Каждый запрос в PHP начинается с чистого листа. Начиная каждый запрос с известного состояния, мы получаем своего рода изоляцию от возможных ошибок; если запрос t сталкивается с неполадкой и завершается с ошибкой, данный баг не оказывает никакого влияния на выполнение последующего запроса t+1.
Отдельно взятый запрос обрабатывается однопоточно, но PHP-FPM (FastCGI Process Manager) сам запустит столько воркеров, сколько нужно (в сконфигурированных рамках) для параллельно обработки
Массивы передаются в функции по значению - это удобно и иммутабельно
Есть деструктуризация, в том числе вложенных структур ключ=>значение ``[['x' => $a, 'y' => $b], ['x' => $c, 'y' => $d]] = [['x' => 1, 'y' => 2], ['x' => 3, 'y' => 4]];``
Работа с файлами, сетью, юникодом, большими числами т.д. (стандартная библиотека) - это тонкая прослойка к Си библиотекам, что работает очень быстро
Можно написать своё расширении для PHP на C, Go или Rust, а затем использовать PHP как высокоуровневый DSL - получите высокую производительность и удобства динамически типизированного DSL.
Регулярные выражения в PHP под капотом используют проверенную временем библиотеку [PCRE](http://www.pcre.org), что гораздо быстрее, чем собственные реализации в других языках, например, Go: http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=regexdna
В PHP есть специальная оптимизация для работы с MySQL, уменьшающая копирование памяти между процессами: вместо libmysql (стандартная библиотека-клиент) реализован так называемый MySQL Native Driver. Было: MySQL -> libmysql -> память процесса PHP; Стало: MySQL -> память процесса PHP http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
Для PHP всегда найдётся актуальный драйвер к вашей любимой СУБД: MySQL, PostgreSQL, SQL Server, Oracle, Firebird, Informix, DB2, SQLLite, MongoDB, Redis, RethinkDB...
[Doctrine](https://ru.wikipedia.org/wiki/Doctrine) - мощная и самая популярная ORM для PHP, которая элегантно реализует многие идеи из Hibernate (Java)
В PHP строки можно использовать как массив байт - аля Python 2. В Python 3 это поменялось - строки стали юникодными, а для работы с байтами используйте отдельный тип, что вызвало не мало проблем при переходе и усугубило раскол сообщества. В PHP тоже планировали перейти на юникодные строки (в не вышедшей версии PHP 6), но не перешли! Работать с юникод строками можно через специальный набор функций, например strlen() vs mb_strlen()
PHP - язык с динамической типизацией, но вы можете расставить типы перед аргументами функций и указать типы возвращаемых значений (включая примитивные типы, интерфейсы и классы), тем самым получив все преимущества статически-типизированных языков. В добавок, если указать конструкцию ``declare(strict_types=1)``, типизация станет ещё и сильной (без приведения int -> float и т.п.)!
PhpStorm - это IDE основанная на Intellij IDEA, которая по богатству фич и поддержке экосистемы языка уступает лишь самой IDEA для Java. Остальные продукты в линейке (WebStorm, RubyMine, PyCharm) явно менее продвинутые, в том числе из-за сложности статического анализа очень уж динамических языков JavaScript, Ruby и Python. В плане возможностей для статического анализа PHP ближе к Java. А хорошая IDE дорогого стоит!
Xdebug - дебаггер и профайлер для PHP, который отлично интегрируется в JetBrains PhpStorm. Стек вызова, состояние переменных, eval - есть всё, что нужно в для продуктивной отладки!
В процессе разработки на PHP не нужно постоянно перезапускать сервер приложения, новый код из изменённых файлов подтянется автоматически. Разработка на PHP в стиле «подумать, отредактировать и перезагрузить страницу» делает разработчиков более продуктивными.
Существует заблуждение, что на каждый запрос PHP заново интерпретирует весь код. На самом деле при первом обращении исходники компилируются в байт-код, который сохраняется в памяти Opcache. При последующих обращениях используется уже закешированный байт-код. По умолчанию проверка исходников на наличие новых происходит не чаще чем раз в 2 секунды, но эту проверку можно вообще отключить и всегда использовать скомпилированный и закешированный байт-код.
Традиционно в PHP используется блокирующий синхронный ввод-вывод - это позволяет писать программы в привычном и простом синхронном стиле. Однако, можно использовать и асинхронную парадигму, в этом случае PHP показывает производительность обработки конкурентных запросов даже большую чем Node.js https://philsturgeon.uk/php/2013/11/12/benchmarking-codswallop-nodejs-v-php/
Темп развития PHP достаточно высокий. Раз в месяц выходит релиз с багфиксами, раз в год с новой функциональностью https://secure.php.net/releases/
Каждый год выходит релиз PHP, который привносит новую функциональность. Такой мажорный релиз имеет 2 года активной поддержки с исправлениями багов и безопасности и ещё 2 года поддержки с исправлениями только по безопасности https://secure.php.net/supported-versions.php
Немного статистики коммитов на github в репозиторий PHP за месяц с 11.10.2016 по 11.11.2016: +14322/-7896. Для сравнения Python: +13325/-7992, Go: +101524/-45323, Linux: +160841/-90146
Классический PHP по скорости имеет паритет с реализацией от Facebook, которая называется HHVM. При этом в HHVM есть JIT, а в PHP пока нет, но обещают в 2018+ году.
После серии версий PHP 5.x вышла версия PHP 7.0. Номер 6 был пропущен, т.к. эта ветка достаточно долго находилась в разработке и зашла в тупик в попытке сделать все строки в Unicode (аля Python 3) https://en.wikipedia.org/wiki/PHP#PHP_6_and_Unicode http://www.slideshare.net/andreizm/the-good-the-bad-and-the-ugly-what-happened-to-unicode-and-php-6
Можно насчитать более двух десятков подкастов о PHP, многие из которых выходят регулярно, , посмотрите на сайт агрегатор [phppodcasts.com](https://www.phppodcasts.com/)
Ежемесячно в блоге JetBrains выходит дайджест PHP Annotated Monthly https://blog.jetbrains.com/phpstorm/category/php-annotated-monthly/ (аналогичные публикации от JetBrains есть ещё только по теме Java Annotated Monthly)
Backend сервисы Slack написаны на PHP и команда считает, что это правильный выбор, чем они и [поделились в своём блоге](https://slack.engineering/taking-php-seriously-cf7a60065329)
Сайт крупнейшей фриланс биржи [Upwork также написан на PHP](https://sdcast.ksdaemon.ru/2016/10/sdcast-49/)
Сайте белого дома США https://www.whitehouse.gov/ работает на Drupal - CMS на PHP. Все наработки команда выкладывает на GitHub https://github.com/whitehouse
Для PHP существует отличный менеджер пакетов Composer с центральным репозиторием (аналогия Maven Central/npm/RubyGems...), управленим версиями и зависимостями.
В PHP хорошо развит инструментарий и культура тестирования: юнит тесты, функциональные, приёмочные, TDD, BDD, а динамическая природа и возможности рефлексии позволяют легко писать моки! Всё современные фреймворки и проекты в мире PHP серьёзно подходят к автоматизированному тестированию и имеют большой процент покрытия.
Помимо автоматизированного тестирования в современной PHP разработке серьёзно относятся и к автоматизированному контролю качества кода. Речь не только о линтерах и форматерах, а о таких сервисах как SensioLabsInsight - проверяет новые коммиты на GitHub, присылает уведомления, советует лучшие практики.
На PHP удобно и просто писать приёмочные и end-to-end тесты с использованием [Selenium WebDriver](http://www.seleniumhq.org/)
Не подумайте, что PHP используется только для простых сайтов и блогов. На PHP пишут и большие enterprise и e-commerce системы с использованием CQRS и DDD. При этом скорость разработки и включения новых разработчиков в проект очень высока.
PHPUnit - фреймворк для тестирования, построенный по архитектуре [xUnit](https://ru.wikipedia.org/wiki/XUnit). PHPUnit легко интегрируется в системы сборки, умеет выводить результаты тестов в JUnit XML формате. JetBrains PhpStorm имеет встроенную поддержку PHPUnit.
Dontbug - дебаггер для PHP, который позволяет записать процесс выполнения PHP скприта, а затем отлаживать как вперёд, так и назад (перепроиграть какой-то фрагмет кода). Интегрируется с JetBrains PhpStorm, очень удобен для изучения кодовой базы!
В подкасте Радио-Т тема PHP поднималась несколько раз: [Выпуск 29](https://radio-t.com/p/2007/04/01/podcast-29/), [Выпуск 267](https://radio-t.com/p/2011/12/11/podcast-267/), [Выпуск 296](https://radio-t.com/p/2012/07/07/podcast-296/), [Выпуск 335](https://radio-t.com/p/2013/04/06/podcast-335/), [Выпуск 414](https://radio-t.com/p/2014/10/18/podcast-414/)
Планируемые изменения в языке PHP и стандартной библиотеке проходят процедуру [RFC](https://wiki.php.net/rfc) (Request for Comments) с голосованием участников основной команды (около 40 человек). Предложенное изменение должно набрать 2/3 голосов для изменения синтаксиса или поведения; 1/2 голосов для минорных улучшений или новой функциональности в стандартной библиотеке.