Выпуск №7 — DevConf

Обзор DevConf 2015: PHP 7, стандарты кодирования, демонизированный PHP, Action-Domain-Response, TypeScript.

DevConf

Всем привет!

Вы слушаете «Пятиминутку PHP», выпуск номер 7 — еженедельный подкаст о новостях из мира PHP, интересных постах в блогах и современных подходах к разработке.

В этом выпуске я хочу рассказать о прошедшей на днях в Москве конференции DevConf.

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

В этом году всё началось с доклада Дмитрия Стогова (одного из ведущих разработчиков PHP и лидера проекта PHPNG) с обзором изменений в PHP 7. Про новые фишки PHP 7 уже были статьи на хабре (раз, два, три) и я кое-что рассказывал в предыдущих выпусках подкаста.

Но позволю себе ещё раз сделать краткий обзор, ведь повторение мать учения (а подробности из доклада Дмитрия вы сможете посмотреть в файлах презентации на сайте DevConf, прямая ссылка будет в шоунотах).
Итак, в PHP 7 нас ждёт:
— новый уровень производительности
— опциональный тайп-хинтинг для скалярных аргументов и указание типа значения возвращаемого функцией. Нам будут доступны четыре предопределённых скалярных типа: bool, int, float, string (а классы с такими именами теперь запрещены, так же как и классы с именами false, true и null)
— EngineExceptions вместо фатальных ошибок
— улучшения в парсере, благодаря использованию абстрактного синтаксического дерева, и как результат исправлена неконсистентность в синтаксисе доступа к переменным
— анонимные классы
— возможность полностью отключить конструкцию assert(), которая полезна при отладке, но увеличивает накладные расходы в production, с помощью ini директивы zend.assertions. Тут же вопрос из зала: планируется ли возможность внедрить какие-то настройки в php.ini, чтобы отключить и другие конструкции, часть используемые при разработке, но которые хотелось бы убрать при запуске на production? Ответ таков, что мы можем наши отладочные вызовы заключить внутрь вызова assert() и при отключении последнего в php.ini, наши отладочные вызовы также перестанут вычисляться!
— вложенные генераторы (конструкция yield from), что позволит разбивать генераторы на более простые части, и поддержка return в генераторах
— новые операторы: оператор сравнения spaceship <=> (удобен для пользовательских сортировок) и оператор ??. От себя добавлю, что оператор ?? — это то, чего я ждал от короткого тернарного оператора, когда он только появился в PHP 5.3. И в тот раз я был очень разочарован. Теперь можно писать так: $foo ?? ‘default value’ — если элемент $foo существует, то именно его значение будет значением выражения. Сравните с коротким синтаксисом тернарного оператора из PHP 5.3: isset($foo) ? : ‘default value’ — если элемент $foo существует, то значением тернарного оператора внезапно будет true — т.к. это результат вычисления isset!
— новые функции random_bytes(), random_int(), intdiv() — целочисленное деление, preg_replace_callback_array(), Closure::call(). Последнее самое интересное, позволяет выполнить анонимную функцию привязав её к какому-то объекту
— новый класс IntlChar
— эскейп последовательность для Unicode: echo «\u{1F602}»
— чистка поведения (foreach, list, switch/default, деление на ноль, конвертация NaN и INF, сдвиг) — тут лучше посмотреть презентацию, много мелких деталей.
— конструкторы в стиле PHP 4 теперь depricated, но пока работают

Ещё один интересный трюк: можно скомпилировать специальную версию PHP для профилирования, затем запустить веб-приложение под этой версией, результаты профилирования будут записаны на диск. После чего нужно скомпилировать PHP заново с использованием этих результатов профилирования — получается специальная сборка оптимизированная под конкретный PHP код! Тесты на WordPress показали увеличение производительности на 8%.

Далее, уже после выхода PHP 7.0, планируется поработать над JIT компиляцией, что ещё увеличит производительность!

Из интересного, о чём я не слышал ранее, возможно, в PHP появится что-то на подобии asm.js — ограниченное подмножество языка, которое будет очень хорошо оптимизироваться движком PHP. Чтобы лучше понять что это и зачем нужно, проведу аналогию с миром JavaScript, где asm.js код генерируют из Си или С++ кода. Например, есть демка показывающая запуск Unreal Engine на Firefox с помощью asm.js и с производительностью около 67% от нативной. Возвращаясь к PHP, мы смогли бы сконвертировать какие-то утилиты написанные на других языках в этот высокопроизводительный asm.php и запускать прямо из нашего PHP приложения, без возьми с установкой расширений или обращения к шеллу! Прощай Zephir!

Следующий доклад от Максима Кочкина о выборе стандарта кодирования в команде PHP-разработчиков Мамбы. Казалось бы, о чём тут можно сказать, если у нас уже есть PSR-1 и PSR-2? (ну или для мамонтов есть стандарты кодирования PEAR, Zend и другие). Ответ содержится в ключевой фразе всей презентации: «ни один стандарт не содержит правила для всех спорных ситуаций»! Максим показывает много интересных примеров и предлагает план действий, который был опробован в Мамбе. А в реализации этого плана помогут такие инструменты, как PHP Code Sniffer, PhpStorm с функцией reformat code, PHP CS Fixer от создалея Symfony и PHP Code Formatter от Badoo.

Доклад про демонизированный PHP — несколько общих советов, когда стоит и когда не стоит писать демонов на PHP, обзор некоторых подводных камней. Но как именно писать написать демона на PHP осталось за кадром, краткий ответ «так же как и на Cи или С++». На мой взгляд эта презентация больше для тех, кто уже в теме и хочет почитать про нюансы и те самые подводные камни.

Про инверсию зависимостей и DDD от Ивана Матвеева — холиварная тема про MVC и Action-Domain-Response паттерн (который я упоминал во втором выпуске подкаста). К сожалению, на сайте конференции нет ссылки на слайды презентации, а там были наглядные примеры кода. В целом, лично я рекомендую ознакомиться с самой идеей Action-Domain-Response, если вы ещё не в курсе, и прилагаю ссылку на оригинальную статью по этой теме от Paul M. Jones.

Не совсем о PHP, но не могу не упомянуть доклад Александра Майорова «TypeScript для PHP разработчика». Многие из нас (PHP разработчиков) иногда трогают разработку на JavaScript в браузере. TypeScript — это надстройка над JavaScript, которая транслируется в обычный JS код с помощью специальных утилит и при этом вводит опциональную статическую типизацию — очень похоже на то, что мы увидим в PHP 7. И Александр показал примеры: код на TypeScript выглядит точно так же, как и PHP код, только в именах переменных нет символа доллара. Всем рекомендую к ознакомлению.

Я рассказал вам лишь о наиболее интересных (с моей точки зрения) докладах касающихся PHP. Но были и другие и не только о PHP! Большая часть презентаций доступна на сайте конференции devconf.ru

Спасибо организаторам, докладчикам и всем участникам, встретимся в следующем году!

  • CommiesZar

    >Теперь можно писать так: isset($foo) ?? ‘default value’
    На самом деле так:
    $foo ?? ‘default value’

    • Точно, сам запутался и всех запутал! Поправил в текстовой расшифровке.
      Спасибо!

  • а будут ли видеозаписи с конференции? может организаторы съёмку вели?

    • Съёмка была — видел камеры, видел операторов. А когда будет доступна и не понятно…

  • Ivan Panfilov

    > Ответ таков, что мы можем наши отладочные вызовы заключить внутрь вызова assert() и при отключении последнего в php.ini, наши отладочные вызовы также перестанут вычисляться!

    т.е. правильно ли я понял — я могу сделать так:

    assert(

    $log(‘message’ , print_r($somevart, true), ‘debug’)

    )

    и функция $log не будет вызыатся при отключенном assert ?

  • Alma Z

    Большое спасибо за ссылку «TypeScript для PHP разработчика»

  • Alma Z

    В итоге Typescript для PHP это тот же самый PHP + С#. Хм. ….. Очень заинтересовало. Но ведь TypeScript для энтерпрайза? То есть для обработки бизнес логики. Интересно как он умеет работать с DOM? Надо глубже изучить вопрос.