Русский
Русский
English
Статистика
Реклама

Php 8

PHP 8 и развитие языка в 30 вопросах и ответах

24.02.2021 12:05:30 | Автор: admin
В конце ноября мы провели стрим с Никитой Поповым и Дмитрием Стоговым, ключевыми контрибьюторами ядра PHP. За полчаса мы получили 100+ вопросов и ребята не успели ответить на все. Поэтому я сгруппировал оставшиеся сообщения по темам, отсеял совсем специфические и собрал ответы в текстовом виде. Все острые и холиварные вопросы оставил.



Готовя ответы, по многим пунктам я консультировался с Никитой и другими активными участниками сообщества. Кстати, в эту субботу, 27 февраля, мы проводим новый стрим! Будет пара докладов, несколько дискуссий, интересные гости и возможность задать новые вопросы. Читайте те, что под катом и подключайтесь, чтобы задать новые.



Планируется ли дальнейшее развитие type hinting? Например, для сигнатур функций.


Простор для улучшений, безусловно, есть. Со времени стрима появились Enum RFC и соответственно возможность их использовать в декларациях типов.

Из того что обсуждалось:
Intersection Types RFC обсуждался несколько раз, вот тут есть немного контекста.
Дженерики см. ниже.
Тайпхинты для Callable тут было несколько RFC: Typesafe callable, Callable prototypes, Functional interfaces. То есть запрос есть, но пока не было удачного RFC.
Алиасы типов обсуждалось в контексте юнион типов, но пока без отдельного RFC.

Конкретных планов по этим идеям пока нет.

Частый вопрос будет ли асинхронный PHP?


Мы получили 13 вопросов за время ноябрьского стрима, вот что именно спрашивали люди
Появится ли когда-нибудь неблокирующий ввод/вывод?

Будет ли добавлена какая-то асинхронность в php имеется в виду встроенная в ядро.

Как оцениваете github.com/amphp/ext-fiber, какая вероятность пройти rfc?

Будет ли РНР асинхронным?

Планируется ли добавление функционала Promise`ов?

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

LibUV. В каком состоянии интеграция LibUV в ZendEngine? И будет ли она?

Будет ли event loop-ы на РНР конкурентные с Нодой?

Планируется ли реализация такого же event loop как в javascrypt?

Theoretically, is it possible, to implement light threads, like coroutines in Kotlin<3, via JIT and FFI? Or is it possible to create an async mechanism using JIT?

Есть ли будущее у асинхронного пхп (reactphp, swoole, asyncphp)?

Будет ли движение php в сторону асинхронщины?

Планируется ли внедрение асинхронности и/или многопоточности в следующих версиях языка?

Смотря что понимать под асинхронным PHP.

Писать неблокирующий код на PHP можно уже сейчас с помощью Amp, ReactPHP, Workerman.

Активно обсуждается предложение по файберам RFC и готова реализация. Если оно будет принято, то это упростит работу с пакетами типа ReactPHP и Amp. Подробнее было на канале PHP Digest.

Вот примеры, как может выглядеть аналог async/await в PHP 8.1 + Amp v3 и на ReactPHP.

Кроме того, еще есть Swoole. Это расширение для PHP, в котором реализовано уже все для создания полностью асинхронных приложений, в том числе драйверы БД, а также корутины и каналы. И даже использование стандартных функций для работы с IO (например file_get_contents()). В 2017 я его не рекомендовал, но сейчас он оброс отличной экосистемой и готов для использования в продакшне.

Есть более минималистичное подмножество Swoole: swow. Теоретически, у него есть даже шансы быть включенным в ядро. Но пока об этом рано говорить. Дождемся результатов голосования по файберам.

Что по дженерикам в PHP?


Мы получили 5 вопросов за время ноябрьского стрима, вот что именно спрашивали люди
Будут ли в php generic`и?

Планируется ли реализация дженериков для PHP? Когда она может увидеть свет?

Дженерики. Будут ли, и когда. Полноценные, или фейковые, без рантайм проверки.

Ну когда же будут дженерики?

Есть ли в планах дженерики?

Короткий ответ: большинство контрибьюторов хотят, но пока нет нормального способа их реализовать в PHP. Не стоит надеяться, что в ближайшее время их добавят в ядре.




Дальше перевод ответа Никиты на Reddit.

Для тех, кто не слишком знаком, есть три широких способа реализации дженериков:
  • Type-erasure (стираемые): Дженерики просто удаляются и Foo<T> становится Foo. Во время выполнения дженерики ни на что не влияют, и предполагается, что проверки типов осуществляются на каком-то предварительном этапе компиляции/анализа (прим. Python, TypeScript).
  • Reification (реификация): Дженерики остаются в рантайме и могут быть на этом этапе использованы (и в случае PHP, могут быть проверены в рантайме).
  • Monomorphization (мономорфизация): С точки зрения пользователя, это очень похоже на реификацию, но подразумевает, что для каждой комбинации аргументов дженериков генерируется новый класс. То есть, Foo<T> не будет хранить информацию что, класс Foo инстанциирован с параметром T, а вместо этого будут созданы классы Foo_T1, Foo_T2, , Foo_Tn специализированный для данного типа параметра.

> Вы сказали, что мономорфизированные дженерики повысят производительность, а reified дженерики потребуют много изменений во всей кодовой базе.

Основная проблема мономорфизации это не столько производительность, (теоретически она хороша, и даже в случае reifieid дженериков может быть смысл мономорфизировать горячие классы по причинам производительности.), сколько использовании памяти. Для каждой комбинации типов аргументов должен быть сгенерирован отдельный класс. Если это также предполагает дублирование всех методов (которые могут зависеть от аргументов типов), то для этого потребуется много памяти.

Мономорфизация как главная стратегия реализации не имеет смысла в PHP. Она важна для таких языков, как C++ или Rust, где возможность специализировать код для определенных типов имеет большое значение для производительности (и даже в этом случае размер кода остается большой проблемой). В PHP мы не получим от него достаточной выгоды в плане производительности, чтобы оправдать накладные расходы по памяти (опять же, когда речь идет об общей мономорфизации). Тем более что непонятно, как можно кэшировать мономорфизированные методы в opcache (из-за требований иммутабельности).

Единственная причина, по которой мономорфизация была предложена в качестве стратегии реализации, заключается в том, что она упростит реализацию наивной модели дженериков. Предполагается, что нам просто нужно сгенерировать новые классы для всех комбинаций, а остальным частям ядра вообще ничего не нужно знать о дженериках. Однако эта идея ломается, если учесть вариативность дженерик параметров (Traversable<int> это Traversable<int|string>), поскольку такие отношения не могут быть смоделированы без непосредственного знания дженерик параметров.

> Не было заметно особо отзывов по исследованию дженериков, которое вы опубликовали на GitHub. Были ли закулисные разговоры об этом, или это все?

Нет, не было особо разговоров об этом. В последний раз, когда я говорил об этом с Дмитрием, его позиция была (неудивительно) жестким "нет". Слишком много сложностей добавляется, потенциально слишком большое влияние на производительность.

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

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

function test(): List<int> {    // We don't want to write this:    return new List<int>(1, 2, 3);    // We want to write this:    return new List(1, 2, 3);}

Мы точно не хотели бы, чтобы людям на PHP пришлось писать больше типов, чем на современном статически типизированном языке, таком как Rust. Однако, я не совсем понимаю, как вывод типов для дженерик параметров в настоящее время может быть интегрирован в PHP. В первую очередь из-за очень ограниченного представления о кодовой базе, которая есть у компилятора PHP (он видит только один файл за раз). Приведенный выше пример очевиден, но почти все, что выходит за его рамки, кажется быстро переходящим в "невозможное".

Это оставляет меня в конфликте с поддержкой дженериков в PHP, и это также является причиной, по которой я не настаивал на обсуждениях этой темы. Я сам не уверен, что это хорошая идея.

> Вы рассматривали стираемые дженерики, как это делает Python?

And that leaves us with the cowards way out

Во-первых, я думаю, что неправильно говорить, что у Python есть стираемые дженерики. У Python все типы стираемые и это все меняет. Если вся ваша модель типов заключается в том, что аннотации типов игнорируются во время выполнения и проверяются отдельным статическим анализатором, то это отдельный самодостаточный подход. Это как phpdoc в PHP.

Наша проблема в том, что у нас уже есть реализация типизации, которая работает путем валидации типов во время выполнения. Делать часть типов валидированными во время выполнения, и часть из них полностью игнорируемыми, было бы неконсистентно (хотя я думаю, что неконсистентность это своего рода девиз PHP...).

Хуже того, в PHP даже не будет встроенного валидатора типов, а проблема будет делегирована стороннему инструменту статического анализа, такому как psalm, phpstan или phan (или, по крайней мере, как я понимаю). Это означает, что тип может быть нарушен по умолчанию, и вы должны пойти еще добавить что-то, чтобы предотвратить это.

Еще хуже (черт возьми, насколько хуже может быть?), у нас в PHP есть разделение типов на слабое и строгое. Типы в PHP это не просто декларации типов, они также могут действовать как приведение типов!

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

class StringList {    public function add(string $value) { $this->data[] = $value; }}$list = new StringList;$list->add(42);var_dump($list); // ["42"]


class List<T> {    public function add(T $value) { $this->data[] = $value; }}$list = new List<string>;$list->add(42);var_dump($list); // [42]

Даже strict_types=1 не полностью спасает нас от этого, потому что преобразования int->float по-прежнему разрешены.

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

Sorry, I just don't have a good answer for you :(


Есть попытка стандартизировать синтаксис и семантику дженериков в PHP: github.com/DaveLiddament/php-generics-standard. Пока она довольно сырая и на ранней стадии обсуждения.

Что можно сделать, чтобы разработка PHP стала доступной более широкому кругу разработчиков?


Под этим заголовком мы объединили 3 оригинальных вопроса с ноябрьского стрима
Расскажите, пожалуйста, о текущем состоянии в области публикаций о внутреннем устройстве PHP (яызка и виртуальной машины). Есть ли что-то, что может помочь, кроме непосредственно чтения исходников?

Какой нужен минимум знаний для разработки ядра и вирт машины?
Как попасть к вам в команду? Спасибо за ответ!

Когда можно будет писать php на php?

Ядро PHP в обозримом будущем останется на C. Поэтому если есть желание контрибьютить, то придется с ним разобраться. Никита обновляет PHP Internals book, в котором описаны внутренности ядра.

И есть статья Никиты PHP 7 Virtual Machine и даже перевод она актуальна и из нее можно почерпнуть все самое важное для старта.

Что касается расширений, то тут есть потенциал для развития. Никита и Дмитрий занимаются исследованием возможности писать расширения на PHP. Ждем результатов этого исследования.

Планируется ли открыть внутреннее API PHP наружу через FFI, чтобы писать экстеншены на самом языке? С учетом отказа от PECL в PHP 8 вопрос становится актуальным.


Такого плана нет.

Задепрекейчен сам инструмент pecl, который использовался для установки расширений, потому что он использовал PEAR. А расширения, конечно же, не задепрекейчены.

Можно ли будет подключать к PHP модули на других языках, кроме C? Я видел примеры подключения Rust через FFI и это очень криво выглядит.


Теоретически это возможно, но технически никто не занимался написанием нужных интерфейсов для FFI.

В качестве альтернативы FFI есть возможность подключения wasm модулей: wasmerio/wasmer-php.

Какое будущее у FFI?


Кажется, что в FFI уже есть все, чтобы его использовать. Пока использование не особо активно.

Убили короткий тэг. Чем руководствовались, какой в этом смысл?


Если речь про <?, то его не убили. Было горячее обсуждение RFC, но в итоге решили, что в ближайшие 5 лет трогать его не будут.

Зачем добавляют mixed type?


Есть два основных аргумента в его пользу:

mixed сигнализирует о том, что тип не забыли указать, просто он не может быть уточнён,
mixed часто фигурирует в документации PHP.

Подробнее можно прочитать в предложении RFC.

Подписывайтесь на канал PHP Digest, чтоб узнавать про такие вещи первыми. Про mixed была заметка еще в мае 2020.

Будет ли развитие рефлексии? Изменение проперти типов?


Изменения типов свойств, то есть ReflectionProperty::setType, и вообще любых изменений классов не будет никогда. Классы неизменяемы это часть философии языка.

Почему Reflection медленный?


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

Почему php разработчики получают меньше, чем Java разработчик (примерно одного уровня). Или это не так?


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

Во-первых, от сложности задач и уровня ответственности, который предполагают эти задачи.

Поскольку на PHP делается очень много простого веба (небольшие сайты, CMS и т. п.), то и средний уровень зарплат возможно ниже.

А во-вторых, от особенностей рынка.

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

Кроме того, что такое Java и PHP разработчики примерно одного уровня? Как вы сравниваете?

Почему стоит выбрать PHP, а не Go или Node.js?


Выбирайте, что больше нравится.

PHP это в основном веб-разработка. Сейчас более популярны "универсальные" языки типа Python и JS. Планируется ли расширять зону применения PHP?


PHP, как язык, такой же универсальный как JS или Python. Вопрос в рантаймах, то есть где его можно запускать. Станет ли возможным запускать PHP в браузере, как JS? Не думаю, потому что зачем?

Одним из мотивов для FFI и JIT как раз был потенциал применения PHP в других сферах. Что из этого выйдет поживем-увидим.

Планируете ли вы интегрировать final свойства в PHP, как, например, immutable data classes в Java?


Идея иммутабельности в том или ином виде постоянно витает в PHP-сообществе. Были разные RFC на эту тему. Скорее всего, что-то будет.

Есть подробное исследование темы от Larry Garfield. И есть черновик RFC по аксессорам свойств, который позволит делать иммутабельные объекты.

Планируется ли уменьшение бюрократии для небольших патчей? Упираюсь в то, что ради мелкого патча просят создать RFC с полным фаршем.


Давайте конкретные примеры. RFC требуются для изменений в синтаксисе языка или при поломке обратной совместимости. Очень много изменений проходит обычными пул-реквестами без RFC.

Если нужна помощь с оформлением RFC пишите либо мне pronskiy, либо @Danack. Кстати, можно ознакомиться с его репозиторием c непринятыми RFC github.com/Danack/RfcCodex и документом по этикету RFC.

Почему фичи PHP 8 такие сырые?


Привет, Кирилл serafimarts :-) Жизнь слишком коротка, чтобы закончить хоть что

  1. Именованные аргументы не гарантируют совместимость на уровне интерфейсов и значительно увеличивают проблемы BC для OS библиотек.

    Есть предложение по атрибуту для задания алиасов #[NamedParameterAlias].
  2. Атрибуты не имеют возможности иерархичной/вложенной декларации и текущий API не позволяет их ввести нормально в будущем.

    См. ниже.
  3. Property Promotion не доделан: Зачем нужны фигурные скобки у конструктора с такими аргументами? Как декларативно их прокинуть в родительский конструктор?

    Не помню, чтоб кто-то поднимал этот вопрос. Почему ты не задал его во время обсуждения RFC?
  4. Почему добавили match, нарушающий дизайн языка? А если добавляются выражения, то где ""$some = foreach (...) => ..."" или ""$some = if(...) => ...""?"

    Видимо, потому, что другие выражения мало кому нужны. Всегда можно создать RFC.
  5. Зачем добавлять union types без возможности их внешней декларации: "type iterable = array | \Traversable""? Почему только дизъюнкция и нет конъюнкции типов?

    Алисы типов годная идея, обсуждается, пока без конкретных планов. По поводу конъюнкции см. ответ в первом вопросе про развитие тайпхинтов.
  6. Зачем костыль со Stringable, но не добавлять такие же неявные имплементации Countable, Serializable, etc...? Почему утиная типизация только для Stringable?

    Stringable нужен, чтоб можно было использовать объект с __toString() там, где стоит тайпхинт string. C Countable и Serializable такой проблемы нет.


Иногда это выбор между сделать так или вообще никак. В разных RFC голосования склоняется в ту или иную сторону.

Какие перспективы по введению nested attributes?


Ответ есть в самом RFC: Why are nested attributes not allowed?

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

То есть, теоретически поддержку сделать можно, но пока не планируется.

А почему с вводом аннотаций не ввели сразу какую то привязку к функциям или методам из коробки, как в том же питоне?


Это другой концепт. Атрибуты в PHP это метаданные, а в Python это декораторы.

Если хочется именно декораторы, возможно, наилучшим решением будет goaop/framework. Пока он, правда, не совместим с PHP 8.

Планируется ли улучшение SPL или поддержки разных структур данных в PHP?


Вот пара вопросов на этот счет от зрителей стрима
Есть какие-то планы по развитию/улучшению SPL в сторону https://github.com/php-ds
Планируется ли добавить в ядро PHP хорошо спроектированные популярные структуры данных: деревья, графы, списки, очереди, множества, кортежи и т.д.
Планируется ли добавление специализированных структур данных (кортежи, множества, деревья т.д.) в ядро?

Есть интерес улучшить эту часть PHP. Из недавнего: обсуждается возможность добавить неймспейс SPL.

Что касается php-ds, то его автор не хотел бы, чтоб расширение мерджили в ядро, потому что в этом случае он был бы привязан к релизному циклу PHP.

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


Да, такие планы есть, более того в каждом релизе что-то делается для этого.

Вот пример из недавнего: Restrict $GLOBALS usage ограничено использование $GLOBALS, что позволило избавиться от кучи внутренних проверок и упростить кодовую базу. Именно об этом говорил Дмитрий Стогов на стриме отвечая на вопрос: что стоило бы убрать в следующих версиях PHP.

Планируется ли в php добавлять библиотеки для машинного обучения?


Нет. А в каком языке они есть в ядре?

Можно использовать RubixML/ML или просто специализированные инструменты.

Как вы относитесь к гегемонии Laravel? AR/статик-методы/трейты


Популярность Laravel точно помогает PHP, а значит помогает и всем, кто пользуется языком.

AR/статик-методы дело вкуса. Про трейты Никиты уже высказался, а на стриме обсудили их вдоль и поперек.

Целесообразно ли поддерживать активно-растущий проект на php 5.6 или начинать понемногу переписывать на php 7 или 8?


Нецелесообразно. Более того, крайне опасно. Лучше активно пофиксить совместимость с PHP 8.0. Не переписывать все на новый лад, а просто сделать возможным запуск минимальными исправлениями. А новые фичи уже делать с использованием новых возможностей.

Есть приведение типов, например int или array, можно сделать приведение типов к объекту?


Можно.

В php есть довольно старое расширение php SOAP. Будет ли оно как-то развиваться/дополняться?


Расширение очень старое и над ним никто активно не работает. Более того, в нем самое большое число открытых багов из всех расширений PHP.

Если вам нужен SOAP, то лучше использовать юзерленд реализации на PHP, а не расширение.

А с какой версии можно использовать или в typehint? CurlHandle|false


Объединенные типы появились в PHP 8.0.

А для чего добавили $object::class? Теперь будут споры что же использовать get_class() или ::class


Добавили для консистентности. Зачем спорить, если можно использовать только новый вариант? roll_safe.gif

Какое будущее у поддержки альтернатив сред выполнения? GraalVM как пример.


Никита и Дмитрий не планируют этим заниматься. Но есть другие люди, возможно кто-то и сделает что-то подобное. В частности, есть концепт для GraalVM.

Будут ли когда-нибудь в PHP возможность запретить доступ к внутренним классам извне библиотеки? Чтобы библиотека предоставляла доступ только к интерфейсным классам, а внутренние использовать запрещено.


Такая идея возникала RFC Namespace visibility и даже чуть раньше была реализация подобного. Проблема в том, что хотелось бы private/internal на уровне пакетов. А у нас только неймспейсы и поэтому непонятно как это должно работать.

Пока остается использовать PHPDoc тэг @internal.

Будет ли возможность определить, какие трейты использует класс? По аналогии с class_implements


class_uses()

Применение каких новинок PHP 8 будет влиять на снижение производительности?


Почти всех :-) Хоть оно и незначительное. Кроме, разве что, проверки типов когда много используется наследования. Но в PHP 8.1 станет намного лучше благодаря inheritance cache.

Сколько можно выиграть в производительности, если убрать все проверки типов рантайме?


Зависит от приложения. Вот inheritance cache для Symfony дает прирост 8% это приблизительно и есть оверхед проверки типов.

Ребята, по памяти будут улучшения? как пример двигать sbrk при застоях и больших дырках


Такая проблема действительно может быть. Например, при использовании расширений, которые выделяют память, используя аллокатор операционной системы, а не PHP. Например, так ведет себя libxml. Но как бороться с этим непонятно. Пока решения нет.

Какие компании финансируют развитие php? Неужели новые версии php выпускают энтузиасты безвозмездно?


Прямо: Zend, JetBrains, Microsoft. Косвенно много других, например, MongoDB, Oracle,

Сколько человек работает над ядром пхп?


Фултайм работают трое: Никита Попов (JetBrains) и Дмитрий Стогов (Zend) над ядром, и Christoph M. Becker (Microsoft) над расширениями.

Активное участие принимают многие. Можно посмотреть по статистике контрибьюторов.

Вот облако тегов тех, кто приложил руку в PHP 8.0:

Картинка от php.watch.

Когда будет PHP 8.1.0?


Новые версии языка выходят каждый год приблизительно в ноябре-декабре. Соответственно, PHP 8.1 ожидается в конце 2021.

p.s. Подключайтесь к стриму в субботу, чтобы узнать больше о состоянии PHP в 2021 году



Подробнее..

PHP 8 Что нового?

25.11.2020 16:04:07 | Автор: admin

PHP, начиная с 7 версии, кардинально изменился. Код стал куда быстрее и надёжнее, и писать его стало намного приятнее. Но вот, уже релиз 8 версии! Ноябрь 26, 2020 примерно на год раньше, чем обещали сами разработчики. И всё же, не смотря на это, мажорная версия получилась особенно удачной. В этой статье я попытаюсь выложить основные приятные изменения, которые мы должны знать.


1. JIT


Как говорят сами разработчики, они выжали максимум производительности в 7 версии (тем самым сделав PHP наиболее шустрым среди динамических ЯПов). Для подальшего ускорения, без JIT-компилятора не обойтись. Справедливости ради, стоит сказать, что для веб-приложений использование JIT не сильно улучшает скорость обработки запросов (в некоторых случаях скорость будет даже меньше, чем без него). А вот, где нужно выполнять много математических операций там прирост скорости очень даже значительный. Например, теперь можно делать такие безумные вещи, как ИИ на PHP.
Включить JIT можно в настройках opcache в файле php.ini.
Подробнее 1 | Подробнее 2 | Подробнее 3


2. Аннотации/Атрибуты (Attributes)


Все мы помним, как раньше на Symfony код писался на языке комментариев. Очень радует, что такое теперь прекратится, и можно будет использовать подсказки любимой IDE, функция "Find usages", и даже рефакторинг!


Забавно, что символ # также можно было использовать для создания комментариев. Так что ничего не меняется в этом мире.

Было очень много споров о синтаксисе для атрибутов, но приняли Rust-like синтаксис:


#[ORM\Entity]#[ORM\Table("user")]class User{    #[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    #[ORM\Column("string", ORM\Column::UNIQUE)]    #[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}

Подробнее 1 | Атрибуты в Symfony


3. Именованые параметры (Named Arguments)


Если вы когда-либо видели код, где есть булевы параметры, то понимаете насколько он ужасен. Ещё хуже, когда этих параметров 8 штук, 6 из которых имеют значение по-умолчанию, а вам нужно изменить значение последнего параметра.


К примеру, код для использования библиотеки phpamqplib:


$channel->queue_declare($queue, false, true, false, false);// ...$channel->basic_consume($queue, '', false, false, false, false, [$this, 'consume']);

С использованием именованых параметров, код становится намного легче читать:


$channel->queue_declare($queue, durable: true, auto_delete: false);// ...$channel->basic_consume($queue, callback: [$this, 'consume']);

Ещё несколько примеров:


htmlspecialchars($string, default, default, false);// vshtmlspecialchars($string, double_encode: false);

Внимание! Можно также использовать ассоциативные массивы для именованых параметров (и наоборот).


$params = ['start_index' => 0, 'num' => 100, 'value' => 50];$arr = array_fill(...$params);

function test(...$args) { var_dump($args); }test(1, 2, 3, a: 'a', b: 'b');// [1, 2, 3, "a" => "a", "b" => "b"]

Подробнее


4. Оператор безопасного null (Nullsafe operator)


Null сам по себе не очень хорошая штука (даже очень плохая). Когда функция возвращает null, то в каждом месте, где идёт её вызов, программист обязан проверить на null. И это приводит к ужасным последствиям.


$session = Session::find(123);if ($session !== null) {    $user = $session->user;    if ($user !== null) {        $address = $user->getAddress();        if ($address !== null) {            $country = $address->country;        }    }}

По хорошему, должен быть метод Session::findOrFail, который будет кидать исключение в случае отсутствия результата. Но когда эти методы диктует фреймворк, то мы не можем ничего сделать. Единственное, это проверять каждый раз на null либо, где это уместно, использовать ?->.


Да, с оператором nullsafe код станет немного лучше, но всё же это не повод возвращать null.

$country = $session?->user?->getAddress()?->country;

Этот код нельзя назвать чистым, только лишь от части. Для чистого кода, нужно использовать шаблон Null Object, либо выбрасывать exception. Идеальным вариантом было б:


$country = $session->user->getAddress()->country;

Поэтому, если возможно с вашей стороны, никогда не возвращайте null (к Римлянам 12:18).

Также интересным моментом в использовании nullsafe есть то, что при вызове метода с помощью ?->, параметры будут обработаны только если объект не null:


function expensive_function() {    var_dump('will not be executed');}$foo = null;$foo?->bar(expensive_function());

5. Оператор выбора match (Match expression v2)


Для начала покажу код до и после:


$v = 1;switch ($v) {    case 0:        $result = 'Foo';        break;    case 1:        $result = 'Bar';        break;    case 2:        $result = 'Baz';        break;}echo $result; // Bar

VS


$v = 1;echo match ($v) {    0 => 'Foo',    1 => 'Bar',    2 => 'Baz',};  // Bar

Как видим, это очень приятный оператор для выбора значений, который удобно заменяет switch.
Но есть очень важное отчилие switch от match: первый сравнивает нестрого ==, а во втором производится строгое === сравнение.


Наглядный пример различия:


switch ('foo') {    case 0:      $result = "Oh no!\n";      break;    case 'foo':      $result = "This is what I expected\n";      break;}echo $result; // Oh no!

VS


echo match ('foo') {    0 => "Oh no!\n",    'foo' => "This is what I expected\n",}; // This is what I expected

В PHP8 этот пример со switch работает по другому, далее рассмотрим это.

Также, сравниваемыми значениями оператора match могут быть выражения. При этом, будут выполнены только те, пока не будет найден первый совпадающий вариант:


$result = match ($x) {    foo() => ...,    $this->bar() => ..., // bar() isn't called if foo() matched with $x    $this->baz => ...,    // etc.};

6. Адекватное приведение строки в число (Saner string to number comparisons)


Проблема


$validValues = ["foo", "bar", "baz"];$value = 0;var_dump(in_array($value, $validValues));// bool(true) ???

Это происходит потому, что при нестрогом == сравнении строки с числом, строка приводится к числу, то-есть, например (int)"foobar" даёт 0.


В PHP8, напротив, сравнивает строку и число как числа только если строка представляет собой число. Иначе, число будет конвертировано в строку, и будет производиться строковое сравнение.


Comparison Before After
0 == "0" true true
0 == "0.0" true true
0 == "foo" true false
0 == "" true false
42 == " 42" true true
42 == "42foo" true false

Стоит отметить, что теперь выражение 0 == "" даёт false. Если у вас из базы пришло значение пустой строки и обрабатывалось как число 0, то теперь это не будет работать. Нужно вручную приводить типы.

Эти изменения относятся ко всем операциям, которые производят нестрогое сравнение:


  • Операторы <=>, ==, !=, >, >=, <, <=.
  • Функции in_array(), array_search(), array_keys() с параметром strict: false (то-есть по-умолчанию).
  • Сотрировочные функции sort(), rsort(), asort(), arsort(), array_multisort() с флагом sort_flags: SORT_REGULAR (то-есть по-умолчанию).

Также, есть специальные значения которые при нестрогом сравнении дают true:


Expression Before After
INF == "INF" false true
-INF == "-INF" false true
NAN == "NAN" false false
INF == "1e1000" true true
-INF == "-1e1000" true true

7. Constructor Property Promotion


Изначально идея позаимствована в языка-брата Hack. Она состоит в том, чтобы упростить инициализацию полей класса в конструкторе.


Вместо прописания полей класа, параметров конструктора, инициализации полей с помощью параметров, можно просто прописать поля параметрами конструктора:


class Point {    public function __construct(        public float $x = 0.0,        public float $y = 0.0,        public float $z = 0.0,    ) {}}

Это эквивалентно:


class Point {    public float $x;    public float $y;    public float $z;    public function __construct(        float $x = 0.0,        float $y = 0.0,        float $z = 0.0,    ) {        $this->x = $x;        $this->y = $y;        $this->z = $z;    }}

С этим всё просто, так как это синтаксический сахар. Но интересный момент возникает при использовании вариативные параметры (их нельзя объявлять таким образом). Для них нужно по-старинке вручную прописать поля и установить их в конструкторе:


class Test extends FooBar {    private array $integers;    public function __construct(        private int $promotedProp,         Bar $bar,        int ...$integers,    ) {        parent::__construct($bar);        $this->integers = $integers;    }}

8. Новые функции для работы со строками (str_contains, str_starts_with, str_ends_with)


Функция str_contains проверяет, содержит ли строка $haystack строку $needle:


str_contains("abc", "a"); // truestr_contains("abc", "d"); // falsestr_contains("abc", "B"); // false // $needle is an empty stringstr_contains("abc", "");  // truestr_contains("", "");     // true

Функция str_starts_with проверяет, начинается ли строка $haystack строкой $needle:


$str = "beginningMiddleEnd";var_dump(str_starts_with($str, "beg")); // truevar_dump(str_starts_with($str, "Beg")); // false

Функция str_ends_with проверяет, кончается ли строка $haystack строкой $needle:


$str = "beginningMiddleEnd";var_dump(str_ends_with($str, "End")); // truevar_dump(str_ends_with($str, "end")); // false

Вариантов mb_str_ends_with, mb_str_starts_with, mb_str_contains нету, так как эти функции уже хорошо работают с мутльтибайтовыми символами.


На самом деле, очень приятно, что наконец-то добавили эти функции. Теперь не нужно писать каждый раз своих костылей с помощью substr, strncmp, strpos.

9. Использование ::class на объектах (Allow ::class on objects)


Раньше, чтобы получить название класса, к которому принадлежит объект, нужно было использовать get_class:


$object = new stdClass;$className = get_class($object); // "stdClass"

Теперь же, можно использовать такую же нотацию, как и ClassName::class:


$object = new stdClass;var_dump($object::class); // "stdClass"

10. Возвращаемый тип static (Static return type)


Тип static был добавлен для более явного указания, что используется позднее статическое связывание (Late Static Binding) при возвращении результата:


class Foo {    public static function createFromWhatever(...$whatever): static {        return new static(...$whatever);    }}

Также, для возвращения $this, стоит указывать static вместо self:


abstract class Bar {    public function doWhatever(): static {        // Do whatever.        return $this;    }}

11. Weak Map


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


Интерфейс класса выглядит следующим образом:


WeakMap implements Countable , ArrayAccess , Iterator {    public __construct ( )    public count ( ) : int    public current ( ) : mixed    public key ( ) : object    public next ( ) : void    public offsetExists ( object $object ) : bool    public offsetGet ( object $object ) : mixed    public offsetSet ( object $object , mixed $value ) : void    public offsetUnset ( object $object ) : void    public rewind ( ) : void    public valid ( ) : bool}

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


class FooBar {    private WeakMap $cache;    public function getSomethingWithCaching(object $obj) {        return $this->cache[$obj] ??= $this->decorated->getSomething($obj);    }    // ...}

Подробнее можно почитать в документации.


12. Убрано возможность использовать левоассоциативный оператор (Deprecate left-associative ternary operator)


Рассмотрим код:


return $a == 1 ? 'one'     : $a == 2 ? 'two'     : $a == 3 ? 'three'     : $a == 4 ? 'four'              : 'other';

Вот как он всегда работал:


$a Result
1 'four'
2 'four'
3 'four'
4 'four'

В 7.4 код как прежде, отрабатывал, но выдавался Deprecated Warning.
Теперь же, в 8 версии, код упадёт с Fatal error.


13. Изменение приоритета оператора конкатенации (Change the precedence of the concatenation operator)


Раньше, приоритет оператора конкатенации . был на равне с + и -, поэтому они исполнялись поочерёдно слева направо, что приводило к ошибкам. Теперь же, его приоритет ниже:


Expression Before Currently
echo "sum: " . $a + $b; echo ("sum: " . $a) + $b; echo "sum :" . ($a + $b);

14. Удалены краткие открывающие php теги


В каждом скрипте, где в настоящее время используется короткий <? открывающий тег, нужно будет внести изменения и использовать стандартный тег <?php.


Это не касается тега <?=, так как он, начиная с 5.4 всегда доступен.


15. Новый интерфейс Stringable


Объекты, которые реализуют метод __toString, неявно реализуют этот интерфейс. Сделано это в большей мере для гарантии типобезопасности. С приходом union-типов, можно писать string|Stringable, что буквально означает "строка" или "объект, который можно преобразовать в строку". В таком случае, объект будет преобразован в строку только когда уже не будет куда оттягивать.


interface Stringable{    public function __toString(): string;}

Рассмотрим такой код:


class A{    public function __toString(): string     {        return 'hello';    }}function acceptString(string $whatever) {    var_dump($whatever);}acceptString(123.45); // string(6) "123.45"acceptString(new A()); // string(5) "hello"

Здесь функция acceptString принимает строку, но что если нам нужно конкретно объект, что может быть преобразован в строку, а не что-либо иное. Вот тут нам поможет интерфейс Stringable:


function acceptString(Stringable $whatever) {    var_dump($whatever);    var_dump((string)$whatever);}// acceptString(123.45); /*TypeError*/acceptString(new A()); /*object(A)#1 (0) {}string(5) "hello"*/

16. Теперь throw это выражение


Примеры использования:


// This was previously not possible since arrow functions only accept a single expression while throw was a statement.$callable = fn() => throw new Exception();// $value is non-nullable.$value = $nullableValue ?? throw new InvalidArgumentException();// $value is truthy.$value = $falsableValue ?: throw new InvalidArgumentException();// $value is only set if the array is not empty.$value = !empty($array)    ? reset($array)    : throw new InvalidArgumentException();

Подробнее можно почитать здесь.


17. Стабильная сортировка


Теперь все сортировки в php стабильные. Это означает, что равные элементы будут оставаться в том же порядке, что и были до сортировки.


Сюда входят sort, rsort, usort, asort, arsort, uasort, ksort, krsort, uksort, array_multisort, а также соответствующие методы в ArrayObject.


18. Возможньсть опустить переменную исключения (non-capturing catches)


Раньше, даже если переменная исключения не использовалась в блоке catch, её всё равно нужно быто объявлять (и IDE подсвечивала ошибку, что переменная нигде не используется):


try {    changeImportantData();} catch (PermissionException $ex) {    echo "You don't have permission to do this";}

Теперь же, можно опустить переменную, если никакая дополнительная информация не нужна:


try {    changeImportantData();} catch (PermissionException) { // The intention is clear: exception details are irrelevant    echo "You don't have permission to do this";}

19. Обеспечение правильной сигнатуры магических методов (Ensure correct signatures of magic methods):


Когда были добавлены type-hints в php, оставалась возможность непавильно написать сигнатуру для магических методов.
К примеру:


class Test {    public function __isset(string $propertyName): float {        return 123.45;    }}$t = new Test();var_dump(isset($t)); // true

Теперь же, всё жёстко контролируется, и допустить ошибку сложнее.


Foo::__call(string $name, array $arguments): mixed;Foo::__callStatic(string $name, array $arguments): mixed;Foo::__clone(): void;Foo::__debugInfo(): ?array;Foo::__get(string $name): mixed;Foo::__invoke(mixed $arguments): mixed;Foo::__isset(string $name): bool;Foo::__serialize(): array;Foo::__set(string $name, mixed $value): void;Foo::__set_state(array $properties): object;Foo::__sleep(): array;Foo::__unserialize(array $data): void;Foo::__unset(string $name): void;Foo::__wakeup(): void;

20. Включить расширение json по-умолчанию (Always available JSON extension)


Так как функции для работы с json постоянно используются, и нужны чуть ли не в каждом приложении, то было принято решение включить ext-json в PHP по-умолчанию.


21. Более строгие проверки типов при для арифметических и побитовых операторов (Stricter type checks for arithmetic/bitwise operators)


Проблема, которую разработчики здесь решили предоставлена кодом ниже:


var_dump([] % [42]);

Что должен вывести этот код? Здесь непредсказуемое поведение (будет 0). Всё потому, что большинство арифметических операторов не должны применятся на массивах.


Теперь, при использовании операторов +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, -- будет вызывать исключение TypeError для операндов array, resource и object.


22. Валидация абстрактных методов в трейтах (Validation for abstract trait methods)


До восьмой версии, можно было писать что-то вроде:


trait T {    abstract public function test(int $x);}class C {    use T;    // Allowed, but shouldn't be due to invalid type.    public function test(string $x) {}}

Начиная с восьмой версии, такой код будет падать с ошибкой. Да, и теперь есть возможность в трейте сделать приватный абстрактный метод, который будет реализован в использующем трейт классе.


trait MyTrait {    abstract private function neededByTheTrait(): string;    public function doSomething() {        return strlen($this->neededByTheTrait());    }}class TraitUser {    use MyTrait;    // This is allowed:    private function neededByTheTrait(): string { }    // This is forbidden (incorrect return type)    private function neededByTheTrait(): stdClass { }    // This is forbidden (non-static changed to static)    private static function neededByTheTrait(): string { }}

Случаи, когда реализация приходит из родительского класса, или трейт применён в родительском классе, также проверяются.


23. Объединения типов (Union Types 2.0)


Рассмотрим код:


class Number {    /**     * @var int|float $number     */    private $number;    /**     * @param int|float $number     */    public function setNumber($number) {        $this->number = $number;    }    /**     * @return int|float     */    public function getNumber() {        return $this->number;    }}

Здесь тип переменной $number контролируется только соглашениями программистов. На самом деле, туда может попасть что-угодно, и выйти отсюда может также что-угодно, так как проверки на тип не обеспечиваются ядром языка.


Теперь же, можно прописать тип int|float (или любой другой) явно, чтобы обеспечить корректность работы модуля:


class Number {    private int|float $number;    public function setNumber(int|float $number): void {        $this->number = $number;    }    public function getNumber(): int|float {        return $this->number;    }}

А также, код становится намного чище.
Как вы уже могли заметить, типы-объединения имеют синтаксис T1|T2|... и могут быть использованы во всех местах, где можно прописать type-hints.


Некоторые оговорки:


  • Тип void не может быть частью объединения.
  • Чтобы обозначить отсутствие результата, можно объявить "Nullable union type", который имеет следующий синтаксис: T1|T2|null.
  • Тип null не может быть использован вне объединения. Вместо него стоит использовать void.
  • Существует также псевдотип false, который по историческим причинам уже используется некоторыми функциями в php. С другой стороны, не существует тип true, так как он нигде не использовался ранее.

Типы полей класса инвариантны, и не могут быть изменены при наследовании.
А вот с методами всё немного интересней:


  1. Параметры методов можно расширить, но нельзя сузить.
  2. Возвращаемые типы можно сузить, но нельзя расширить.

Вот как это выглядит в коде:


class Test {    public function param1(int $param) {}    public function param2(int|float $param) {}    public function return1(): int|float {}    public function return2(): int {}}class Test2 extends Test {    public function param1(int|float $param) {} // Allowed: Adding extra param type    public function param2(int $param) {}       // FORBIDDEN: Removing param type    public function return1(): int {}           // Allowed: Removing return type    public function return2(): int|float {}     // FORBIDDEN: Adding extra return type}

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


class A {}class B extends A {}class Test {    public function param1(B|string $param) {}    public function param2(A|string $param) {}    public function return1(): A|string {}    public function return2(): B|string {}}class Test2 extends Test {    public function param1(A|string $param) {} // Allowed: Widening union member B -> A    public function param2(B|string $param) {} // FORBIDDEN: Restricting union member A -> B    public function return1(): B|string {}     // Allowed: Restricting union member A -> B    public function return2(): A|string {}     // FORBIDDEN: Widening union member B -> A}

Интереснее становится когда strict_types установлен в 0, то-есть по-умолчанию. Например, функция принимает int|string, а мы передали ей bool. Что в результате должно быть в переменной? Пустая строка, или ноль? Есть набор правил, по которым будет производиться приведение типов.


Так, если переданный тип не является частью объединения, то действуют следующие приоритеты:


  1. int;
  2. float;
  3. string;
  4. bool;

Так вот, будет перебираться этот список с типами, и для каждого проверяться: Если тип существует в объединении, и значение может быть приведёно к нему в соответствии с семантикой PHP, то так и будет сделано. Иначе пробуем следующий тип.


Как исключение, если string должен быть приведён к int|float, то сравнение идёт в первую очередь в соответствии с семантикой "числовых строк". К примеру, "123" станет int(123), в то время как "123.0" станет float(123.0).


К типам null и false не происходит неявного преобразования.

Таблица неявного приведения типов:


Original type 1st try 2nd try 3rd try
bool int float string
int float string bool
float int string bool
string int/float bool
object string

Типы полей и ссылки


class Test {    public int|string $x;    public float|string $y;}$test = new Test;$r = "foobar";$test->x =& $r;$test->y =& $r;// Reference set: { $r, $test->x, $test->y }// Types: { mixed, int|string, float|string }$r = 42; // TypeError

Здесь проблема в том, что тип устанавливаемого значения не совместим с объявленными в полях класса. Для Test::$x это могло быть int(42), а для Test::$y float(42.0). Так как эти значения не эквивалентны, то невозможно обеспечить единую ссылку, и TypeError будет сгенерирован.


24. Тип mixed (Mixed Type v2)


Был добавлен новый тип mixed.
Он эквивалентен типу array|bool|callable|int|float|object|resource|string|null.
Когда параметр объявлен без типа, то его тип это mixed.
Но стоит отметить, что если функция не объявляет возвращаемого значения, то это не mixed, а mixed|void. Таким образом, если функция гарантировано должна что-то возвращать, но тип результата не известен заранее, то стоит написать его mixed.


При наследовании действуют следующие правила:


class A{    public function bar(): mixed {}}class B extends A{    // return type was narrowed from mixed to int, this is allowed    public function bar(): int {}}

class C{    public function bar(): int {}}class D extends C{    // return type cannot be widened from int to mixed    // Fatal error thrown    public function bar(): mixed {}}

Подробнее можно почитать здесь


Где смотреть новые фичи


Более информации про новые функции в PHP можно посмотреть на rfc watch.


IMHO хорошие идеи для PHP



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


Вот пример проблемного кода. Со временем значение изменяется, и при добавлении ещё какой-либо обработки велика вероятность сломать что-то на следующих строках:


$invoice = getInvoice();$invoice = loadDependencies($invoice);$invoice = formatInvoice($invoice);// hm... how do I access initial $invoice now?return $invoice;

Я вижу как минимум 4 недостатка в этом коде:


  1. Никогда точно не знаешь что в переменной;
  2. Невозможность использовать уже перезаписанное значение где-то дальше в коде;
  3. Неустойчивость к изменениям если производиться копипаст большой части кода с такими-же переменными где-то во вложенном if, тогда ночь отладки обеспеченна.
  4. Каждый раз нужно писать знак $ перед $переменной. Да, это спорно, но ведь без долларов проще читать код. Возьмите какого-либо джависта, что он скажет про ваш код? Уххх как много долларов!

Вот каким мог быть этот код:


invoice = getInvoice();invoiceWithDependencies = loadDependencies(invoice);invoiceFormatted = formatInvoice(invoiceWithDependencies);// someAnotherAction(invoice);return invoiceFormatted;

Значения, что содержатся в invoice, invoiceWithDependencies, invoiceFormatted не могут быть перезаписаны. Да, и теперь мы точно знаем что и где хранится.


function printArr(array arr) {    foreach (arr as firmValue) {        print strtr(            "Current value is {current}. +1: {next}",             [                '{current}' => firmValue,                 '{next}'    => firmValue + 1            ]        );    }}


use Spatie\ModelStates\State;abstract class OrderStatus extends State{    public static string $name = static::getName();    abstract protected function getName(): string;}

Как видим, при первом обращении к $name, будет вызван метод getName финального класса. Это дает нам возможность настраивать какие значения будут попадать в поля в зависимости от каких-либо условий. А в данном примере это использовано с шаблоном "Template Method", и финальные классы обязаны предоставить нам значение для поля.


Сейчас многие фреймворки имеют значени по-умолчанию для большинства конфигураций в своих классах. Проблема с таким подходом заключается в том, что мы можем предоставить только примитивное значение. Никаких вызовов функций не разрешено. А что если мы хотим вызвать хелпер config для предоставления конфигурации, которая задаётся в поле класса? Тогда у нас проблемы, и нужно переопределять конструктор, где уже задавать значение поля. Хорошо, когда конструктор не имеет много параметров. А что, если там много параметров (к примеру, 7)? Тогда для простого создания поля, нужно 20 дополнительных бесполезных строк кода. И выглядит это ещё как уродливо!


Просто сравните это:


    protected string $whatever = $this->doCalculate();

И это:


    public function __construct(        array $query = [],        array $request = [],        array $attributes = [],        array $cookies = [],        array $files = [],        array $server = [],        $content = null    ) {        parent::__construct(            $query,            $request,            $attributes,            $cookies,            $files,            $server,            $content        );        $this->whatever = $this->doCalculate();    }

Почему мы должны инициализировать поле в конструкторе, если оно не зависит от его параметров? Как по мне, мы не должны.

Подробнее..

Ловушки для современного PHP

26.12.2020 16:10:02 | Автор: admin


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


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


Примечание


Далее я буду использовать слово "квалификация" не в ругательном смысле, а как набор необходимых знаний и навыков, необходимых как для работы вообще, так и для работы с некой технологией Х в частности. То есть, разработчик на Symfony квалифицированнее разработчика на Wordpress, потому что ему нужно уметь писать код и работать с БД, а разработчик на Wordpress в целом может во время своей работы из админки и не вылазить.


PHP для "простых" решений и малого бизнеса


Первое очевидное применение языка лежит в написании на нём всевозможных сайтов-визиток, интернет-магазинов, форумов и даже немного стартапов. PHP долгое время был крайне прост и не имел множества фич, присущих более строгим языкам.


Также язык был крайне нетребователен к инфраструктуре, так как можно было просто поправить нужный файлик на своей VPSке прямо через FTP, без сборок и релизов.
К квалификации разработчиков он, впрочем, тоже был нетребователен, так как интерпретируемый, типизация слабая, а архитектура вообще уникальна: php "обречен на смерть" и каждый запрос обрабатывается в новом процессе, можно не бояться ни утечек памяти, ни манипуляций общим состоянием программы, ни прочих способов одному запросу помешать другому.
Также из-за своей динамической структуры PHP стал отличным движком для создания CMS, позволяя очень легко расширить и отладить программу, методом подкладывания на сервер файликов с исходниками, для чего даже не нужно быть программистом.


Итого, был язык, простой, как палка, прощающий множество ошибок, легкий для изучения и в целом нетребовательный. Логично, такой привлекает множество разработчиков не самой высокой квалификации, просто за счёт того, что более высокая квалификация для работы им и не требуется. А это порождает следующее: низкая квалификация означает низкие рейты, низкие рейты означают привлекательность для малого бизнеса, а это создаёт множество рабочих место и своеобразную популярность, привлекая ещё больше новичков и тд и тп.
Где-то здесь находятся и стартапы: имея в начале мало денег и вынужденные выживать среди бесконечных MVP и перестроек, им проще взять что-то максимально простое и дешевое. Большинство стартапов, конечно, умирает, но самые удачливые "выстреливают", стремительно обрастая деньгами и более развитыми технологиями, при этом продолжая нести в себе ядро из всем знакомого PHP. Привет, Facebook, VK, Slack, Такси и тд и тп.
Область понятна, как понятно и то, что нужно сделать для того, чтобы оставаться "королём CMSок": ничего не испортить. Нужно просто быть таким же простым и, может, даже примитивным, чтобы за счёт этого выигрывать популярность среди новичков и малого бизнеса у более навороченных технологий.


PHP для энтерпрайза


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


И всё кажется прекрасным, потому что "энтерпрайзный PHP" действительно даёт возможность нормально писать сложные продукты и даже не сильно при этом страдать, но здесь есть одно большое НО и имя ему Java (либо C#).
В виртуальную машину Java вложены десятки тысяч человеко-лет, которые делают её лучшей на текущий момент виртуальной машиной в мире. Тулчейн и экосистема джавы развивались годами сразу для серьезного языка и тоже множеством людей и компаний, в итоге предоставив огромную и крайне проработанную экосистему (от IDE до стандартов и библиотек), равной которой найти сложно и равной которой экосистема PHP при всех её плюсах не является. На Java пишет намного больше квалифицированных разработчиков, а также намного больше серьёзных энтерпрайз решений, что означает большие рейты, что означает больше квалифицированных разработчиков и тд и тп.


И здесь же кроется своего рода ловушка, PHP успешно копирует множество удачных решений из Java-мира, увеличивая собственную сложность и строгость. Но сможет ли он побить одного из "королей энтерпрайза" на его собственном поле? Я несколько сомневаюсь.
А это означает, что PHP имеет шансы остаться энтерпрайзом второго эшелона, некой второй Java. Для меня это вызывает вопрос: зачем в таком случае нужна вторая джава, если уже есть первая?


При этом всё было бы не так плохо, если бы стремление к совершенству не противоречило предыдущему направлению: в погоне за тем, чтобы стать "правильным", PHP легко может потерять свою простоту и скорость разработки, а вместе с тем множество дешевых разработчиков, а вместе с ними и привлекательность для бизнеса.


PHP для микросервисов и современных фич


Оставаясь простым, интерпретируемым и однопоточным, php не то, чтобы успевает за своими более шустрыми и современными конкурентами:


  • PHP быстр, но и golang/nodejs/{any modern lang} далеко не медленнее, а при этом ещё умеют в ассинхронность/многозадачность "из коробки", без внешних расширений языка, велосипедов и воркеров на супервизорах.
  • PHP много чего умеет, но и golang/nodejs/{any modern lang} могут работать через сокеты "из коробки", а вот "слоник" нет.
  • PHP как бы умеет в функиональщину, но довольно ограниченно, в отличие от современных typescript/scala/kotlin/*.
  • PHP скоро научится в дженерики и аннотации, но эти вещи существуют в той же Java и прочих "современных" языках уже давно, вместе с целым рядом других фич.
  • Ну и уж конечно, в области микросервисов, low latency, выбора и тюнинга сборщиков мусора, замеров аллокаций и прочих элементов разработки действительно высокопроизводительных приложений, php чувствует себя не очень уверенно, будучи изначально не тем (ну не контейнер с nginx, phpfpm и сотней воркеров микросервисом-то называть, в самом-то деле) и не про то.

Чтобы доминировать здесь, PHP было бы необходимо в корне измениться, от синтаксиса до архитектуры своей виртуальной машины и принципов её работы, а также основательно обрасти фичами, что в итоге сделает "слоника" совсем другим языком.
Это опять возвращает нас к вопросу: а нужен ли сообществу тот, новый PHP? И возможно ли стать новым крутым языком с гринтредами, встроенным сервером, монадами и черт знает чем ещё, сохранив свою фирменную нетребовательность?


Выводы


Кажется, что PHP пытается усидеть на нескольких стульях сразу: быть и удобным для быстрокодеров на CMS за 10$ в час, и изучаться за две недели вчерашним студентом чтобы завтра же найти работу, и чтобы уважаемые люди серьёзные проекты для других уважаемых и серьезных людей могли делать, и чтобы всё было современно и красиво. Не порвутся ли эти штаны? Не потеряет ли "слоник" старых пользователей, не снискав при этом достаточного внимания новых?
Непонятно.
Конечно, даже самый негативный вариант не означает неминуемой гибели: легаси написано уже очень много, а разработчиков, знающих и любящих именно PHP тоже порядочно. Языки программирования способны умирать очень долго и крестражей у них значительно больше семи.
Но, с другой стороны, ada, smalltalk, delphi и прочие всё же умерли, а тот же ruby, похоже, завис где-то в чистилище, при наличии и множества программистов, и кодовой базы.
С третьей стороны, пора бы уже включить похороны PHP в список спортивных дисциплин, двадцать лет хоронят уже, да всё не умирает никак вот ведь какая ирония.
Разумеется, даже при самом удачном течении событий, даже успешно совместивший и старое и новое PHP вряд ли станет языком #1.
И уж конечно, никто не заставляет писать на одном только PHP, все будут выносить нагруженные места в приложения на golang, работать с сокетами на ноде и крутить это всё в кубернетесе, но это уже совсем другая история.

Подробнее..

Каким будет 2021-й год для PHP?

15.02.2021 16:13:26 | Автор: admin

Об этом мы спросили Никиту Попова, Дмитрия Елисеева и еще десяток активных контрибуторов и авторов контента из сообщества. Все они поучаствуют в большом PHP-стриме днем 27 февраля (это суббота). Будет пара свежих докладов, несколько острых дискуссий, розыгрыш фирменных PHP-слонов и других крутых подарков. Подключайтесь!


Роман Пронский (JetBrains), автор PHP-дайджеста. Соведущий нашего митапа

Каким будет 2021-й год для PHP, чего ждешь?

Будет PHP 8.1, будут крутые движухи в сообществе.

Самое плохое, что случилось в мире PHP в 2020?

Отмена конференций. Особенно жалко, что не было офлайн-версии PHP Russia очень жду ее в этом году!

Ок, а самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Было много всего. PHP исполнилось 25 лет было круто повспоминать все события за четверть века и подготовить страницу истории.

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

А еще на свет появился панк-слоник PhpStorm. Правда, из-за падемии не удалось завезти его в Россию и Украину. Надеюсь в 2021-м он наконец-то доберется до нас физически.


Валентин Удальцов, автор телеграм-канала Пых. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Надеюсь, что офигенным! Со своей стороны хочу реализнуть до лета библиотеку Thesis для нативной работы с SQL.

Самое хорошее, что случилось в контексте PHP в 2020?

Я интегрировался с русскоговорящее PHP-сообщество: это и год помогло провести веселее, и узнать-рассказать много нового.


Дмитрий Елисеев, автор блога ElisDN. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP и сообщества?

Надеюсь на возобновление оффлайн-активности. Хочется погулять по митапам.

Самое хорошее, что случилось в контексте PHP в 2020?

У меня в 2020-ом случилось внедрение вышедшего в 2019-ом PHP 7.4. Семёрка мне была интересна в основном явной типизацией. Вот наконец type hints добрались и до полей. В проектах вычистил кучи PHPDoc-ов и стало удобнее для Psalm-а.

Понравился рост распространённости Psalm. Его активно внедряют популярные библиотеки вроде Doctrine, Laminas. Да и для кода без него появляются плагины и стабы. Это позитивно сказывается на качестве интерфейсов. Уходят union types. Если в начале года приходилось туго с его внедрением в проект, то сейчас намного приятнее. Но пока с этим туго у некоторых стандартных PHP-функций.

Также за год прилетело много мажорных релизов. Тот же сильно ускоренный Composer 2 и новый Xdebug 3. Обрадовала интеграция сниферов и Psalm в PhpStorm.

Самое плохое, что случилось в мире PHP в 2020?

Немного неприятно, что даже сейчас, в феврале 2021-го ещё не все библиотеки перевели на восьмёрку. А в остальном: меня все устраивает.


Илья Левин, разработчик в Skyeng, на митапе сделает доклад Как работают видеоконференции в браузере: фронт и бэк

Каким будет 2021-й год для PHP?

Жду совершенствования типизации и прочие удобняхи, которые позволят писать короткий и понятный код. 8-ка предоставила новые фичи в этом плане, но хочется еще лучше, короче, быстрее. Жду 8.1 и Symfony 5.3(Symfony просто прелесть, моя прелесть)))

Еще очень верю, что опять начнутся локальные митапы в оффлайне.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Если не говорить про 8-ку, отмечу два минорных релиза Symfony 5.1 и 5.2. Несмотря на пандемию, из-за которой пострадал весь мир, команда Symfony стабильно выпускает новинки.


Антон Околелов, ведущий подкаста Цинковый прод

Каким будет 2021-й год для PHP?

Хотелось бы асинхронных штук из коробки. Fibers мне не очень понравились, какие-то громоздкие конструкции, всё вручную. Это скорее подпорка для существующих решений-костылей (Swoole и тд). Но это тоже шаг вперед, по крайней мере кто-то задумался о проблеме.

Enums ждём, а еще лучше сразу с tagged unions и паттерн-матчингом.

Самое плохое, что случилось в мире PHP в 2020?

Отменили конференцию PHP Russia из-за пандемии. И еще я узнал, что Дмитрий Стогов не считает отсутствие асинхронщины в php проблемой номер один, это прям расстроило. Вот тот момент на видео:


Николай Пучко, автор телеграм-канала PHP Today. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Судя по некоторым RFC - противоречивым=) Очень боюсь, что станет настолько сладко, что слипнется, - если вы понимаете о чем я. Но некоторые вещи, например, enum, я очень жду.

Также жду релиз Yii3 - хочется чего-то новенького уже потрогать. Когда-то давно Yii поразил своей коробочной завершенностью. Кажется, что тройка по функционалу вполне сможет потягаться с Symfony.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)

Кажется, кроме восьмерки все прошло стабильно. Наверное, стоит отметить толчок к развитию сообщества в онлайне, который дал ковид. А у меня наконец нашлось время писать на Хабр и в канал.

Обратный вопрос

Тоже отмечу ковид, но в личном плане: у меня продуктивность выше в офисе, дома слишком много отвлекающих персон.


Антон Титов (SpiralScout), автор RoadRunner, на митапе представит самые упоминаемые доклады-2020 по версии сообщества

Каким будет 2021-й год для PHP?

Очень клевым! Жду интеграции Temporal.io в PHP, RoadRunner 2.0 и еще больше инструментов.

Самое хорошее, что случилось в мире PHP в 2020?

Релиз 8-ки все затмил!

Самое плохое, что случилось в мире PHP в 2020?

PHPclub окончательно скатился в неюзабельное состояние из-за токсичности.


Сергей Жук (Skyeng), автор подкаста "Между скобок". Соведущий нашего митапа

Каким будет 2021-й год для PHP?

Всё больше и больше внимания уделяется "асинхронной теме". Ожидаю развития в этом направлении: fiber-ы и фреймворки поверх ReactPHP.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Язык прошел отметку 25 лет. Дальше только туземун!

Самое плохое, что случилось в мире PHP в 2020?

Не состоялась PHP Russia.


Константин Буркалёв, ведущий подкаста SDCast. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Думается, что он должен быть просто стабильным: планомерное улучшение производительности, отшлифовка стандартов RFC. Надеюсь также, что оковы короны спадут и появится оффлайн-активность в сообществах.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Различные онлайн-активности: с дискуссиями, новыми форматами. Кажется где-то даже довелось поучаствовать :) Например, был классный стрим про код-ревью с ребятами из сообщества:


Александр Макаров (Yii), руководитель ПК PHP Russia. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Интересным. Будут новые RFC. Будут апдейты в рекомендациях PHP-FIG. Надеюсь, релизнем Yii 3.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

GitHub actions начали повсеместно использовать. Psalm. PhpStorm научился новым крутым штукам.


Пётр Мязин, ведущий подкаста Пятиминутка PHP. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Ждём живого общения и тусовок в offline: PHP Russia, BeerPHP и других митапов

Самое хорошее, что случилось в контексте PHP в 2020 (кроме релиза 8-ки)?

Попробовал админ-панель Laravel Orchid, классная штука, по ходу дела появилось миллион идей как бы я всё переделал, улучшил или зарефакторил, но пока держу себя в руках :)

Обратный вопрос

Мало подкастов записал в 2020-м. Не хватало вдохновения. Даже купил новый микрофон себе к Новому году, чтобы исправить ситуацию. Но он так и лежит неопробованный(


Антон Жуков, разработчик в ManyChat. На митапе сделает доклад Тандем приложений на gRPC

Каким будет 2021-й год для PHP?

Время покажет. Я жду скорейшего LTS 8-й версии PHP и перехода на более стандартизированную версию PHP. Слабая стандартизация породила огромное количество legacy и продолжает этим заниматься.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

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


Никита Попов (JetBrains), один из core team PHP. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

You tell me ;)

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Оригинал ответа на английском

Okay, okay I think a small but important thing that happened in 2020, is the introduction of a "life support" phase for PHPUnit: After a PHPUnit version becomes unsupported, it will still be made compatible with new PHP versions for some time. For example, if you want to add support for PHP 8 to your library, you no longer need to also migrate to PHPUnit 9 at the same time, as PHPUnit 8 will also work. This is a big deal for me, because in my experience, making open-source libraries compatible with new PHP versions is very little about breaking changes in PHP, and a lot about breaking changes in PHPUnit.

Тэкс, дай подумать Думаю, что небольшая, но важная вещь, которая произошла в 2020 году, это долгосрочная поддержка PHPUnit: старые версии инструмента, которые больше не поддерживаются, будут оставаться совместимыми с новым версиями PHP какое-то время. Скажем, если вы хотите добавить в свою библиотеку поддержку PHP 8, то не надо еще и мигрировать на PHPUnit 9. C PHPUnit 8 тоже всё будет работать. Это важно, так как по моему опыту, если ты хочешь сделать опенсорсную библиотеку совместимой с новой версией PHP, в основном вопрос будет не в PHP, а именно в PHPUnit.

Самое плохое, что случилось в мире PHP в 2020?

Оригинал ответа на английском

It's not something "bad", but I'm somewhat disappointed in the practical impact of the Just-in-Time compiler in PHP 8. All past experience did indicate that the JIT compiler would probably not have much impact on typical web code, but I was still hoping that it would turn out differently in the end. The inheritance cache recently introduced in PHP 8.1 promises to have a much larger practical impact, with much less effort. Of course, there are cases where the JIT is useful, but I'm not quite convinced that the amount of effort Dmitry put into this project was worth it.Не то чтобы это было плохо, но я немного расстроен практической применимостью JIT-компилятора в PHP 8. Все тесты указывали, что JIT не будет сильно влиять на типичный код веб-приложений, но я до последнего надеялся. Inheritance cache в PHP 8.1 выглядит гораздо более обещающим с практической точки зрения, а усилий на него положено меньше. Безусловно, я знаю примеры, когда JIT оказался по-настоящему полезен, но я пока так и не уверен, что оно стоило времени и сил, которые Дмитрий положил на этот проект.

Не то чтобы это было плохо, но я немного расстроен практической применимостью JIT-компилятора в PHP 8. Весь прошлый опыт указывал на то, что JITособо не повлияет на типичные веб-приложения, но я до последнего надеялся. Inheritance cache в PHP 8.1 выглядит гораздо более многообещающим с практической точки зрения, а усилий на него положено меньше. Безусловно, я знаю примеры, когда JIT оказался по-настоящему полезен, но я пока так и не уверен, что оно стоило времени и сил, которые Дмитрий положил на этот проект.

P.S.

Никита и Дмитрий, судя по опросу русскоязычного PHP-сообщества об итогах 2020-го, JIT зашел многим. Спасибо за него и не только!

Остальные результаты этого опроса огласим на стриме.

P.P.S.

А еще разыграем пару слонов и другие полезные и приятные подарки для PHP-разработчика.

Полный список ништяков и другие подробности - тут.

Подробнее..

PHP-Дайджест 182 (1 22 июня 2020)

22.06.2020 10:10:48 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: 3 принятых и 6 новых RFC-предложений из PHP Internals, включая голосование за новый синтаксис для атрибутов @@ и почему #[] был бы лучше, переименования black/whitelist в PHP-мире, как отлаживают PHP-разработчики, аналог ngrok на PHP, видео, подкасты и многое другое.

Приятного чтения!



Новости и релизы



Yii



Laminas



Async PHP



Материалы для обучения



Аудио/Видео



Спасибо за внимание!

Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 181

Подробнее..

PHP-Дайджест 185 (20 июля 3 августа 2020)

03.08.2020 12:13:23 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 Alpha 3, PhpStorm 2020.2, новый оператор ?->, снова обсуждение синтаксиса атрибутов и другие новости PHP Internals, обзор системы типов в PHP, порция полезных инструментов, видео, стримы и многое другое.

Приятного чтения!



Новости и релизы


  • PHP 8.0.0 Alpha 3 Последний альфа-релиз из запланированных. Первая бета ожидается 6 августа.
  • Релиз PhpStorm 2020.2 Объединенные типы PHP 8, новый движок потока управления, пул-реквесты GitHub, OpenAPI. По ссылке подробный разбор этих и других изменений.

PHP Internals


  • [RFC] Shorter Attribute Syntax Change История с синтаксисом атрибутов в PHP 8 продолжается. Предыстория была в канале.

    Вкратце: сначала был << >>, переголосовали за @@, а теперь новый виток обсуждений.
    У @@ были проблемы с парсером, но они решены благодаря нижеупомянутому RFC про неймспейсы. Тем не менее у него есть другие проблемы, и в качестве альтернативы предлагался вариант #[ ] как в Rust, но и у него есть минусы.

    Дошло до того, что рассматривается вариант переголосования за новый синтаксис и перенос атрибутов в PHP 8.1, потому что фиче-фриз для 8.0 уже 4 августа. То есть либо в PHP 8.0, но с одним из << >>, #[], @@, либо в PHP 8.1 с чем угодно.

    Для последнего случая предлагаются самые разные новые варианты: @[Attribute], в комментарии PHPDoc с двойной собачкой /** @@MyAttribute */, или даже маловероятный переделать оператор подавления ошибок из @ в @@, а одинарную @ использовать в атрибутах.


Laravel



Материалы для обучения



Аудио/Видео



Спасибо за внимание!

Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту, в твиттер или телеграм pronskiy.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 184
Подробнее..

PHP-Дайджест 186 (3 17 августа 2020)

17.08.2020 12:08:41 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 Beta 1, снова о синтаксисе атрибутов в PHP 8: #[Attr] vs @[Attr], предложение по синтаксису для BigInt, обзоры PHP8 и много других видео, инструменты, стримы, подкасты.

Приятного чтения!



Новости и релизы



PHP Internals


  • [RFC] Shorter Attribute Syntax Change История с синтаксисом атрибутов в PHP 8 продолжается. О финальном голосовании было в канале, но позже оно было приостановлено из-за того, что не был соблюден регламент по 2х-недельному обсуждению.

    Tycon Andre привел примеры, не очень удачного поведения варианта #[Attr] в PHP 7. C другой стороны, какая разница, если остальные варианты просто отвалятся с ошибкой парсинга?

    И сравнение синтаксисов @@Attr, #[Attr], <<Attr>> и @[Attr]:
    Скрытый текст
    @@ORM\Entity@@ORM\Table("user")class User{    @@ORM\Id @@ORM\Column("integer") @@ORM\GeneratedValue    private $id;    @@ORM\Column("string", ORM\Column::UNIQUE)    @@Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])    private $email;}#[  ORM\Entity,  ORM\Table("user")]class User{    #[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    #[ORM\Column("string", ORM\Column::UNIQUE)]    #[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}@[  ORM\Entity,  ORM\Table("user")]class User{    @[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    @[ORM\Column("string", ORM\Column::UNIQUE)]    @[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}<<  ORM\Entity,  ORM\Table("user")>>class User{    <<ORM\Id, ORM\Column("integer"), ORM\GeneratedValue>>    private $id;    <<ORM\Column("string", ORM\Column::UNIQUE)>>    <<Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])>>    private $email;}@:ORM\Entity@:ORM\Table("user")class User{    @:ORM\Id @:ORM\Column("integer") @:ORM\GeneratedValue    private $id;    @:ORM\Column("string", ORM\Column::UNIQUE)    @:Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])    private $email;}
    
  • [RFC] Named Parameters explicit opt in Документ был переделан и теперь вместо переименования параметров предлагает лишь явно указывать, что данный параметр именованный.
    // Именованный параметр включен явноfunction callBar(Foo $:parameterName) {    $internalName->bar();}$x = new Foo();callBar(parameterName: $x);// Параметр не именованныйfunction callBar($externalName) {    $externalName->bar();}$x = new Foo();callBar(externalName: $x); // Error: cannot call function callBar() using parameter $externalName by name.
    
    Поскольку PHP 8 уже заморожен для новых фич, то данное предложение возможно только в 8.1, да и то маловероятно.
  • [Proposal] Bigint shorthand (123n) for GMP objects Интересное предложение пока без официального RFC.

    Предлагается реализовать в PHP синтаксис для больших чисел аналогичный JavaScript с добавлением в конце суффикса n:
    $theBiggestInt = 9007199254740991n
    

    При этом под капотом будет использоваться GMP. А поскольку для объектов GMP уже перегружены арифметические операторы, а также битовые и сравнения, то работа с такими числами будет прозрачной.
  • В рамках дискуссии на тему улучшения интерактивного шелла PHP (php -a), предложен PR, который позволит задавать колбэк отрабатывающий на вывод из интерактивного шелла. Или пока можно использовать bobthecow/psysh.
  • cross[RFC] PHP Namespace Policy Отклонен.

Инструменты


  • PHPUnit 9.3 C поддержкой PHP 8 и Xdebug 3.
  • sebastianbergmann/cli-parser Микропакет для парсинга аргументов командной строки, выделенный из PHPUnit.
  • coduo/php-matcher Валидация данных по паттернам для тех, кто не хочет в регекспы.
  • phpfn/phpfn Функциональные примитивы от SerafimArts.
  • hidehalo/nanoid-php PHP-реализация Nanoid безопасного URL-совместимого генератора уникальных идентификаторов.
  • woohoolabs/zen Простой PSR-11-совместимый контейнер с генератором файла предзагрузки.
  • loophp/collection Легковесные коллекции.

Symfony



Laravel



Материалы для обучения



Аудио/Видео



Занимательное





Спасибо за внимание!

Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 185
Подробнее..

PHP-Дайджест 187 (18 августа 7 сентября 2020)

07.09.2020 12:20:38 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 beta 3, принят новый синтаксис атрибутов в PHP 8, Zephir всё, целая пачка полезных инструментов, статьи, видео, подкасты.

Приятного чтения!



Новости и релизы


  • PHP 8 beta 3 Последняя бета в цикле. Следующим релизом станет RC 1, который ожидается 17 сентября.
  • PHP 7.4.10, PHP 7.3.22
  • Будущее Zephir и Phalcon Один из контрибьюторов языка Zephir и PHP-фреймворка Phalcon ушёл из проекта, поэтому активная разработка Zephir приостановлена, а Phalcon 5 планируется переписать на чистый PHP.
  • В WordPress сообществе обсуждается план по поддержке версий PHP. Судя по ответам лидера проекта Matt Mullenweg, PHP 5.6 будет поддерживаться еще долго. По официальной статистике PHP 5.6 используется на 21.6% установок WP.

PHP Internals


  • check[RFC] Shorter Attribute Syntax Change Наконец-то закончилась эпопея с синтаксисом для атрибутов. На переголосовании принят вариант #[Attribute].
    #[  ORM\Entity,  ORM\Table("user")]class User{    #[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    #[ORM\Column("string", ORM\Column::UNIQUE)]    #[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}
    

    Кстати, предыдущий синтаксис с @@Attr не поддерживал группировку атрибутов и поэтому такая возможность была убрана из PR. Но поскольку у #[ ] есть маркер конца, то группировку он поддерживает и она была возвращена.

    // Можно и так#[ORM\Entity]#[ORM\Table("user")]// и так#[    ORM\Entity,    ORM\Table("user")]
    

    Подробнее об атрибутах было в посте.
  • new[RFC] any() and all() on iterables Предлагается добавить две новых функции в стандартную библиотеку:
    any(iterable $input, ?callable $callback = null): bool запустит колбек на каждом элементе и остановится, на первом, который вернет true.
    all(...) вернет true только, если колбек вернет true для каждого элемента.

    Пример использования:

    // Было$satisifes_predicate = false;foreach ($item_list as $item) {    if (API::satisfiesCondition($item)) {        $satisfies_predicate = true;        break;    }}if (!$satisfies_predicate) {    throw new APIException("No matches found");}// Сталоif (!any($item_list, fn($item) => API::satisfiesCondition($item))) {    throw new APIException("No matches found");}
    

Инструменты


  • Pest 0.3 Обертка над PHPUnit, которая позволяет писать тесты в более простом виде. Также готов плагин для PhpStorm Pest IntelliJ.
  • Codeception/Verify 2.0 Ассершены для PHPUnit и Codeception с fluent-интерфейсом.
  • ramsey/composer-repl Добавляет команду composer repl для запуска bobthecow/psysh.
  • brick/money Библиотека для работы с денежными данными. Работает, даже если не уставлены GMP или BCMath. Сравнение с moneyphp/money.
  • bassim/super-expressive-php Библиотека позволяет описывать регулярные выражения почти-естественным языком через текучий интерфейс. Альтернатива VerbalExpressions/PHPVerbalExpressions.
  • phpsci/phpsci-carray Расширение PHP для научных вычислений. Основано на NumPy.
  • github.com/phpwebclient Декораторы и хелперы для PSR-18 совместимых HTTP-клиентов.
  • hamlet-framework/type Библиотека для спецификации типов. Может быть использована везде, где нужна спецификация типов, включая cast, assert, instanceof и т. п.

Symfony



Laravel



Yii


  • yiisoft/auth Свежий пакет из семейства Yii 3 предоставляет различные методы аутентификации, набор абстракций для реализации в приложении, и PSR-15 middleware для аутентификации.
  • yiisoft/strings Хелперы для работы со строками.

Async PHP



Материалы для обучения


Подробнее..

PHP-Дайджест 189 (21 сентября 5 октября 2020)

05.10.2020 12:23:18 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8.0 RC 1 и переименование параметров внутренних функций, PhpStorm 2020.3 EAP, многострочные короткие лямбды, атрибуты для групп свойств и другие новости PHP Internals, порция полезных инструментов, статьи, стримы, подкасты.

Приятного чтения!



Новости и релизы


  • PHP 8.0.0 RC 1 Стартовал цикл релиз-кандидатов ветки 8. Запланировано 4 выпуска и второй релиз-кандидат ожидается 15 октября.

    Усилия core-команды сосредоточены на пересмотре имен аргументов во всех модулях. Пример переименований в PDO. За ходом можно наблюдать здесь.
  • PhpStorm 2020.3 EAP Стартовала программа раннего доступа. Уже реализована полная поддержка PHP 8 поможет быстро сделать пакеты совместимыми с новой версией интерпретатора. Запланированы Xdebug 3, PHPStan/Psalm (в следующих билдах), интеграция Guzzle с HTTP-клиентом и другие фичи.
  • PHP 7.2.34
  • PHP 7.3.23
  • PHP 7.4.11
  • ruphpcommunity.ru PHP-митапы, чаты и ютуб-каналы.
  • Традиционный Hacktoberfest с возможностью получить футболку за 4 пул-реквеста в открытые проекты пошел в этом году не по плану.

    Какой-то ютубер опубликовал инструкцию и показал, как делать примитивные пул-реквесты с изменениями в readme. Посыпался шквал бессмысленных PR. В итоге DigitalOcean теперь учитывают пул-реквесты только в те репозитории, у которых авторы явно указан топик hacktoberfest.

    Если вы хотите поучаствовать в опенсорсе и получить футболку, то вот инструкция как сделать хороший пул-реквест и список и issues с тегом #hacktoberfest в PHP-проектах.

PHP Internals


  • check[PR] Attributes on property groups Атрибуты можно будет указывать сразу для группы свойств, а не только по одному, так же как это работает для модификаторов доступа.
    class FooBar {    #[NonNegative]    public int $x, $y, $z;}
    
  • check[PR] Attributes and strict types Также атрибуты будут принимать во внимание директиву strict_types=1.
  • [PR] OPCache: Direct execution opcode file without php source code file Концепт в виде в PR, в котором автор предлагает сделать возможным сохранять бинарный файл опкеша и запускать его уже без исходника. По сути, это что-то напоминающее подход в Java или очень похожее на питоновские файлы .pyc / .pyo.

    Теоретически, в этом случае можно было бы распространять предварительно скомпилированный PHP-код без исходников. Типа как .phar, но уже интерпретированный.

    Но в обсуждении указали на проблемы такого подхода. Формат опкода в PHP нестабилен и несовместим от версии к версии. Причем даже в рамках патч-релизов, то есть код скомпилированный на PHP 7.4.22 может просто свалиться с segfault на PHP 7.4.23. А сделать его стабильным маловероятно.
  • [PR] Multiline arrow functions Короткие лямбды, добавленные в PHP 7.4, могут содержать только одно выражение. В этом пул-реквесте представлена реализация многострочных коротких лямбд:
    $guests = array_filter($users, fn ($user) => {  $guest = $repository->findByUserId($user->id);  return $guest !== null && in_array($guest->id, $guestsIds);});
    

    Из явных преимуществ по сравнению с обычными лямбдами можно отметить автоматический захват скоупа, то есть не надо добавлять use.

    Также остается открытым вопрос синтаксиса, а именно стоит ли добавлять стрелку =>:
    fn() => {}
    
    или
    fn() {}
    

Инструменты


  • thephpleague/event 3.0.0 Популярный пакет для событий теперь совместим с PSR-14.
  • terrylinooo/simple-cache Драйверы кеша по стандарту PSR-16 для хранения в файлах, Redis, MySQL, SQLite, APC, APCu, Memcache, Memcached и WinCache.
  • Code With Me (EAP) В тестовом режиме доступен плагин для совместной работы в IDE от JetBrains.
  • Bolt 4.0 Обновление популярной CMS на Symfony- компонентах.

Symfony



Laravel



Yii


  • W3C откажется от WordPress и будут использовать CraftCMS, который сделан на базе Yii 2. Сама новость не была бы такой интересной без отличного документа о том, какие аспекты принимались во внимание при выборе.

Async PHP


  • micc83/mailamie Простой SMTP-сервер для тестирования отправки почты. Реализован на ReactPHP.

Материалы для обучения



Аудио/Видео






Спасибо за внимание!

Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 188
Подробнее..

PHP-Дайджест 190 (5 19 октября 2020)

19.10.2020 12:14:37 | Автор: admin
Фото: Илья Шихалеев.

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8.0 RC 2, Xdebug 3 beta, PhpStorm EAP с поддержкой PHPStan и Psalm, порция полезных инструментов, статьи, видео, митапы.

Приятного чтения!



Новости и релизы



Инструменты


  • PHP-DI Независимый от фреймворка DI-контейнер.
  • markrogoyski/math-php Мощная современная математическая библиотека для PHP.
  • Danack/FloatHex Функции для преобразования числа с плавающей точкой в шестнадцатеричную строку и обратно, а также для отображения двух чисел с плавающей точкой в виде двоичного представления. Или еще раз почему 0.1 + 0.2 === 0.3 -> false
    Скрытый текст
    echo float_compare(0.3, 0.1 + 0.2);>> Sign  Exponent     Mantissa                                                 0  01111111101  0011001100110011001100110011001100110011001100110011     0  01111111101  0011001100110011001100110011001100110011001100110100     -  -----------  -------------------------------------------------xxx 
    
  • marcocesarato/PHP-Antimalware-Scanner Сканер для поиска вредоносного кода в PHP-файлах.
  • Prometheus PHP Клиент для prometheus.io на PHP.
  • shivammathur/setup-php GitHub action для установки PHP, расширений, и прочего для последующего использования в своих пайплайнах. Небольшой обзор в блоге GitHub.

Symfony



Laravel



Async PHP


  • clue/reactphp-mq Легковесная очередь сообщений в памяти на базе ReactPHP.

Материалы для обучения



Аудио/Видео





Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 189
Подробнее..

PHP-Дайджест 191 (19 октября 2 ноября 2020)

02.11.2020 14:14:45 | Автор: admin
Фото: Валерий Горбачев (PHP Krasnodar)

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8.0 RC 3 и видеообзоры новых возможностей, Composer 2, завершение разработки Faker (теперь в новой организации), два новых RFC для PHP 8.1, порция полезных инструментов, статьи, видео с прошедших митапов.

Приятного чтения!



Новости и релизы



PHP Internals


  • [RFC] Short Functions В этом RFC предлагается добавить синтаксис стрелочных функций для однострочных именованных функций и методов.
    class Person{    public function __construct(        private string $firstName,    ) {}    public function getFirstName(): string => $this->firstName;}"
    
  • [RFC] Explicit octal integer literal notation В PHP шестнадцатеричные числа записываются с префиксом 0x, а двоичные с 0b. Восьмеричные же сейчас выбиваются из ряда и записываются с префиксом 0. Кроме неконсистентности, это может привести к проблемам при нестрогом сравнении с числовой строкой. Например, 016 в десятичном представлении равно 14 и в результате "016" == 016; // false.

    Предлагается для восьмеричных чисел разрешить нотацию с префиксом 0o, которая является стандартом и используется во многих других языках.
    0o16 === 14; // true016 === 0o16; // true"016" == 0o16; // false
    
  • Literal types PoC Концепт литерального типа для PHP как в TypeScript.
    function foo(): "foo"|"bar" {    return "foo";}
    

    Литеральный тип вряд ли будет реализован в PHP, но вот есть черновик RFC с предложением алгебраического типа данных, т. е. продвинутых перечислений.

Инструменты


  • Infection PHP 0.20 В свежем обновлении фреймворка для мутационного тестирования добавлено 8 новых мутаторов и возможность автоматически добавлять комментарии прямо в PR на GitHub.
  • JustSteveKing/php-sdk Скелет для разработки PHP SDK для сервисов и API.
  • Hi-Folks/rando-php Хелпер для генерирования псевдослучайных данных с различными фильтрами: $randomChars = Randomize::sequence()->chars()->count(10)->noDuplicates()->generate();
  • voku/PHPDoctor Проверяет файлы и директории и находит места, где не хватает деклараций типов.
  • Psalm 4 Обновление популярного статического анализатора.
  • phpDocumentor v3.0.0 Мажорное обновление инструмента для генерирования документации на основе PHPDoc.

Symfony



Laravel



Yii



Материалы для обучения



Аудио/Видео





Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 190
Подробнее..

PHP-Дайджест 192 (2 16 ноября 2020)

16.11.2020 14:12:10 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: Последний релиз-кандидат PHP 8.0 перед финальным релизом и свежие материалы по PHP 8, RFC и обсуждения из PHP Internals, порция полезных инструментов, стримы, подкасты, статьи.

Приятного чтения!



Новости и релизы



PHP Internals


  • [Draft] Closure self reference Ранний черновик на обсуждении. Предлагается в замыканиях добавить псевдопеременную $lambda, которая указывает на само замыкание. По аналогии с $this для классов.
    $fibonacci = function (int $n) use (&$fibonacci) {    if ($n === 0) return 0;    if ($n === 1) return 1;    return $fibonacci($n-1) + $fibonacci($n-2);};// =>$fibonacci = function (int $n) {    if ($n === 0) return 0;    if ($n === 1) return 1;    return $lambda($n-1) + $lambda($n-2);};
    
  • [PR] Support for <func>::function syntax Концепт синтаксиса ::function (или ::fn) для получения полного неймспейса и имени функции по аналогии с ::class. Подобное предложение обсуждалось раньше и имеет проблемы, но вполне вероятно будет принято.
  • [Discussion] Alias for `int|float` Обсуждалась возможность ввести псевдоним number или numeric для объединенного типа int | float. В комментариях указали, что уж лучше позже сделать полноценные алиасы для типов как в TypeScript: type Number = Foo|Bar;.

Инструменты


  • mnavarrocarter/php-fetch Порт fetch WebApi на PHP без сторонних зависимостей. Лаконичный HTTP-клиент в одной функции:
    Скрытый текст
    use function MNC\Http\fetch;$response = fetch('http://personeltest.ru/aways/habr.com');echo $response->status()->code();   // 200echo buffer($response->body());// orwhile (($chunk = $response->body()->read()) !== null) {    echo $chunk;}
    
  • themsaid/ibis Поможет сгенерировать полноценную электронную книгу в PDF из markdown-файлов.
  • i582/phpstats Инструмент для сбора метрик кода и графов зависимостей для PHP. Реализован на базе VKCOM/noverify, то есть на Go.
  • mihaeu/dephpend Инструмент статического анализа, который поможет выявить проблемы в архитектуре путем анализа зависимостей классов.
  • httpsoft/http-message Строгая и быстрая реализация стандартов #PSR-7 и #PSR-17.
  • spatie/crypto Небольшая обертка над openssl для шифрования данных с помощью приватного/публичного ключа. Вводный пост.
  • icanhazstring/systemctl-php PHP-обертка над systemctl.

Symfony



Laravel



Yii



Async PHP



phpstorm PhpStorm



Разное



Аудио/Видео



Занимательное


  • vincentpontier.com/elephpant/ Официальный магазин слоников снова доступен! Можно заказать розового и синего.

Спасибо за внимание!

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

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 191
Подробнее..

Встречаем PHP 8 вместе советы по обновлению, мнения за и против и интервью с одним из ключевых разработчиков

23.11.2020 14:22:47 | Автор: admin
У PHP отличное сообщество. Пандемия отобрала у нас митапы и конференцию, но мы можем собраться 25 ноября вечером в онлайне на:

  • доклад PHP 8: юзерленд нескучный обзор с примерами и рекомендациями,
  • дискуссию о развитии языка,
  • и сессию Q&A с Никитой Поповым (вопросы соберем по ходу эфира).


Для участия достаточно зарегистрироваться, это бесплатно. А пока есть время, мы попросили ребят, которые придут в трансляцию, вспомнить, за что они любили и не любили предыдущие версии языка.


Роман pronskiy Пронский автор PHP-дайджестов и главный по маркетингу в PhpStorm. Соведущий нашего митапа


Что было самым крутым в PHP 5?
Неймспейсы, оператор goto ( )

А самым ужасным и вредным?
Трейты.

Когда PHP 6 не увидел свет, ты
Искал свою первую работу, связанную с PHP.

Самое крутое в PHP 7?
Zend Engine 3 производительность!

А самое бесполезное в 7-ке?
Не помню ничего такого.


Александр SamDark Макаров соавтор Yii3, главный по программе PHP Russia. Соведущий нашего митапа


Что было самым крутым в PHP 5?
Zend Engine 2. Нормальное ООП в сравнении с PHP 4 + много классных фич в промежуточных релизах.

А самым ужасным?
Ничего прям ужасного не вспомню.

Когда PHP 6 не увидел свет, ты
В общем-то, не заметил этого :) Но потом, когда вчитался, понял, какой объём работ был выкинут и насколько это должно быть обидно.

Самое крутое в PHP 7?
Скорость, типизация, ??, анонимные классы.

А самое бесполезное в 7-ке?
Семёрка хорошая.


Валентин vudaltsov Удальцов автор телеграм-канала Пых, активный контрибьютор в Symfony


Что было самым крутым в PHP 5?
То, что больше не снится мне в страшных снах.

А самым ужасным?
trait

Когда PHP 6 не увидел свет, ты
Перешёл на QBasic.

Самое крутое в PHP 7?
??=

А самое бесполезное в 7-ке?
trait.


Альберт alexleonov Степанцев, автор статьи Мне не нравится, во что превращается PHP


Что было самым крутым в PHP 5?
Самое крутое, что он был вообще. Без него бы не было современных версий.

А самым вредным?
Пятерка была разной: между 5.6 и 5.0 скорее больше различий, чем чего-то общего. Язык изменился неузнаваемо. Лично для меня, наверное, самым вредным стало то, что длина int зависит от разрядности операционной системы.

Когда PHP 6 не увидел свет, ты
Хотел скупить все книги по PHP 6, которые успели издать.

Самое крутое в PHP 7?
NG.

А самое бесполезное в 7-ке?
Когда-то считал бесполезными анонимные классы. Теперь так не считаю.

p.s. Стрим организован совместными усилиями Онтико (PHP Russia), devrel-команды Skyeng и проекта PHP Point. Отдельное спасибо Алисе alyssashch Мартыновой из ростовского ИТ-сообщества RnD Tech за помощь с сайтом митапа.
Подробнее..

PhpStorm 2020.3 PHP 8, атрибуты, PHPStan и Psalm, Xdebug 3, Tailwind CSS и совместная разработка

08.12.2020 08:06:23 | Автор: admin


Рады представить финальный мажорный релиз PhpStorm в этом году! Под катом подробный разбор всех изменений и новых возможностей.





PHP 8


PHP 8.0 выпущен. Большое спасибо всем контрибьюторам и менеджерам релиза!

PhpStorm 2020.3 поддерживает все последние изменения языка. Давайте рассмотрим, что доступно и как это использовать в IDE.

Версия языка в статусбаре


Теперь в статусной строке всегда отображается текущая версия PHP проекта. Оттуда же можно переключить версию.



Если переключатель не активен, это означает, что ограничение на версию PHP задано в composer.json.

Именованные аргументы


В PHP 8 аргументы функций и методов могут передаваться путем указания имени параметра. Вызовы теперь автоматически задокументированы, а необязательные параметры стали необязательными в полном смысле слова.

С помощью квик-фикса Add name identifiers можно добавить имена к аргументам:



Опечатки или ошибочные имена аргументов подсвечиваются:



Если передаваемое значение совпадает со значением параметра по умолчанию, то его можно смело удалить:



Вместо массива options для передачи набора параметров можно использовать именованные аргументы, просто передавая только необходимые. Аргументы, передаваемые таким образом, в отличие от элементов массива, являются типобезопасными.



Атрибуты


Атрибуты это новый, структурированный способ указания метаданных в PHP вместо комментариев PHPDoc.

Чтобы создать атрибут, надо объявить класс и добавить маркер #[Attribute]. Здесь PhpStorm поможет с подсветкой, автодополнением кода, поиском использований, рефакторингами и прочим.



Сам PHP проверяет валидность атрибутов только при вызове ReflectionAttribute::newInstance(). А если не обращаться к атрибутам через Reflection, то они полностью игнорируются, чтобы не загружать лишние классы и не создавать объекты.

А вот PhpStorm провалидирует все в редакторе, не запуская Reflection API. При этом проверяются следующие правила:

  • Указанный класс действительно может быть атрибутом.


  • Данный атрибут применяется только в разрешенных местах: класс, свойство, метод, параметр, функция или константа класса.


  • Атрибут повторяется только в том случае, если он объявлен с флагом Attribute::IS_REPEATABLE.



Вот атрибуты в действии с Symfony:





Штормовские атрибуты PHP 8


Несколько атрибутов доступны в PhpStorm 2020.3 из коробки в неймспейсе \JetBrains\PhpStorm\.

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

А вот если вы дополнительно используете другие инструменты статического анализа и не хотите получать ошибок типа Class not found, то тогда, возможно, стоит добавить пакет атрибутов JetBrains/phpstorm-attributes как зависимость в composer.json.


#[Deprecated]


Используйте этот атрибут как PHPDoc-тег @deprecated, чтобы пометить методы, классы или константы классов, которые будут удалены в будущем.

Преимущество тут в том, что можно указать замену для устаревшего кода и пользователю будет проще обновиться.

Давайте посмотрим на реальный пример. В недавно выпущенном Symfony 5.2 метод \Symfony\Component\DependencyInjection\Alias::setPrivate() объявлен устаревшим. Если там добавить атрибут #[Deprecated], то можно упростить миграцию.

#[Deprecated(   reason: 'since Symfony 5.2, use setPublic() instead',   replacement: '%class%->setPublic(!%parameter0%)')]





#[ArrayShape]


Этот атрибут полезен для работы с простыми структурами данных или объектоподобными массивами, когда по какой-то причине нельзя объявить класс.

Синтаксис вот такой:
#[ArrayShape([// key => type,   key1 => int,   key2 => string,   key3 => Foo,   key3 => App\PHP 8\Foo::class,])]function functionName(...): array


Тип может быть указан как строка или как ссылка на класс в виде FQN строки или константы ::class.



Массив, который определяет форму, можно вынести в константу и переиспользовать:

const  MY_ARRAY_SHAPE = [];#[ArrayShape(MY_ARRAY_SHAPE)]




В PhpStorm мы уже проаннотировали атрибутом #[ArrayShape] некоторые стандартные функции PHP, например parse_url().

К счастью, синтаксис однострочных атрибутов обратно совместим. То есть, если записать #[ArrayShape] в одну строку в проекте на PHP 7, то интерпретатор PHP воспримет эту строку как комментарий.

В отличие от интерпретатора PHP, PhpStorm все равно будет анализировать атрибуты! Так что, даже если ваш проект работает на PHP 7.4 или ниже, вы все равно получите пользу от добавления #[ArrayShape].


#[Immutable]


Неизменяемые объекты не могут быть изменены после инициализации или создания. Их использование делает состояние программы более предсказуемым и облегчает отладку.

Атрибутом #[Immutable] можно пометить весь класс или конкретные свойства, чтобы показать, что они не могут быть изменены.

PhpStorm будет проверять использование таких объектов и свойств и подсвечивать попытки изменения.



Изменение свойства по умолчанию разрешено в конструкторе, но можно также разрешить и в методах private/protected. Это делается с помощью констант CONSTRUCTOR_WRITE_SCOPE, PRIVATE_WRITE_SCOPE, PROTECTED_WRITE_SCOPE, передаваемых в конструктор #[Immutable].




#[Pure]


Этим атрибутом помечаются чистые функции, то есть те, которые не производят никаких побочных эффектов. Такие функции можно безопасно удалить, если результат их выполнения впоследствии не используется.



Если функция помечена как чистая, но в ее теле есть попытка изменить что-то за пределами из внешнего скоупа, то PhpStorm подсветит небезопасный код.



Все стандартные чистые функции PHP уже помечены этим атрибутом в PhpStorm.


#[ExpectedValues]


С помощью этого атрибута можно указать, какие значения функция принимает в качестве параметров, а какие может возвращать.

Это практически то же самое, что делает expectedArguments() в .phpstorm.meta.php. Разница лишь в том, что мета-версия, скорее, вспомогательная, а атрибут жестко указывает, что других возможных значений нет.

Например, рассмотрим функцию count:
count ( array|Countable $array_or_countable [, int $mode = COUNT_NORMAL ] ) : int

Еe второй аргумент целое число, но на самом деле это не произвольное целое число, а одна из констант COUNT_NORMAL или COUNT_RECURSIVE.

Вот как атрибут #[ExpectedValues] улучшит ситуацию:



То есть появилось автодополнение, а если передано что-то другое, то подсвечивается ошибка.

Как указать возможные значения или битовые маски
Ожидаемые значения передаются в конструктор атрибута и могут быть одним из следующих:
  • Числа: #[ExpectedValues(values: [1,2,3])]
  • Строковые литералы: #[ExpectedValues(values: [red, black, green])]
  • Константы: #[ExpectedValues(values: [COUNT_NORMAL, COUNT_RECURSIVE])]
  • Константы класса: #[ExpectedValues(values: [Code::OK, Code::ERROR])]


И есть несколько способов указать ожидаемые аргументы:
  • #[ExpectedValues(values: [1,2,3])] означает, что ожидается только одно из значений.
  • #[ExpectedValues(flags: [1, 2, 3])] означает, что ожидается битовая маска заданных значений, например 1 | 3.
  • #[ExpectedValues(valuesFromClass: MyClass::class)] означает, что ожидается любая из констант класса `MyClass`.
  • #[ExpectedValues(flagsFromClass: ExpectedValues::class)] означает, что ожидается битовая маска констант из класса `MyClass`.



Еще один пример #[ExpectedValues]


Возьмем хелпер response() из Laravel. В качестве второго параметра он принимает статус код HTTP.

Есть две проблемы
  • Нет автодополнения с возможными кодами
  • Нет проверки правильности значения в редакторе




Давайте исправим это, добавив атрибут #[ExpectedValues(valuesFromClass: Response::class)]




#[NoReturn]


Некоторые функции могут приводить к остановке выполнения скрипта. Если отметить такие функции как точки выхода атрибутом #[NoReturn], то улучшится анализ потока управления.




#[Language]


Этот атрибут можно добавить к строковым параметрам, в которых ожидается текст на каком-либо языке, например RegExp, SQL, DQL и так далее.

Для аргументов появится подсветка и дополнительные возможности.






Вернемся к новым возможностям PHP 8.

Объявление свойств в конструкторе


Обычные свойства можно преобразовать в promoted или обратно с помощью квик-фикса Convert to promoted property.



PhpStorm гарантирует, что свойства используются только способом, разрешенным в PHP 8:
  • Можно декларировать свойства только в конструкторе.
  • Нельзя объявлять в абстрактном конструкторе.
  • Нельзя объявлять свойство variadic таким образом.
  • Свойство не может иметь тип 'Callable'.
  • Не допускается переопределение свойства.





Если свойство объявлено новым способом, но в теле конструктора осталась инициализация, то PhpStorm предложит ее удалить.



Выражение match


Новое выражение похоже на switch, но использует строгое сравнение и может быть присвоено переменной или возвращено.

PhpStorm определяет, может ли блок switch быть переделан в match, и сделает это автоматически с помощью квик-фикса по нажатию Alt+Enter:



Может быть трудно увидеть неправильное использование нового выражения, поэтому PhpStorm подсветит все ошибки.




Будут обнаружены дублирующиеся значения в условиях:



Выражение match с одной веткой и веткой по умолчанию может быть безопасно заменено на тернарное выражение.



А если осталась только ветка по умолчанию, то соответствие match вообще не понадобится.



Наконец, если в разных ветвях одинаковые тела, они могут быть объединены.



Оператор nullsafe


Вместо кучи условий с проверкой на null теперь можно использовать цепочку вызовов с новыми оператором ?->.

PhpStorm проверит правильность использования оператора:



Висячая запятая


Теперь допустимо добавлять запятую после последнего аргумента при вызове функций и в списке замыканий use.



Non-capturing catches


В PHP 8 можно ловить исключение в catch-блоке без переменной.



Выражение throw


Бросать исключения теперь можно в стрелочных функциях и в коротких операторах ??, а также в тернарном ? :.



Можно использовать сокращение thr и нажать tab это live template.



Константа ::class на объектах


Раньше, чтобы получить FQN объекта, нужно было использовать функцию get_class(). В PHP 8 вызов get_class($object) можно смело заменить на $object::class.

Собственно, по нажатию Alt+Enter такую замену и можно сделать. Неправильное использование константы ::class PhpStorm подсветит.



Новые функции для строк: str_contains(), str_starts_with(), str_ends_with()


How do I check if a string contains a specific word? самый просматриваемый вопрос по PHP на Stack Overflow. В PHP 8 есть четкий ответ на этот вопрос: использовать функцию str_contains().

PhpStorm 2020.3 находит вызовы strpos(), которые можно заменить на str_contains():



Есть также новые str_starts_with() и str_ends_with() для определения того, начинается или заканчивается ли строка определенной подстрокой. PhpStorm подсвечивает, где вызовы substr() можно заменить новыми альтернативами:



Reclassified engine warnings


В PHP 8 для многих ошибок был пересмотрен тип бросаемого предупреждения. А именно, вместо Notice во многих случаях будет Exception или Type Error.

В PhpStorm в связи с этим некоторые инспекции имеют два разных уровня severity: для PHP 8 и для более старых версий.



Это все из наиболее заметного по PHP 8. Есть еще целая куча изменений помельче, которые будут видны при обновлении на PHP 8.


Поддержка Psalm и PHPStan


Оба статических анализатора можно использовать в PhpStorm 2020.3 для подсветки проблем непосредственно в редакторе.



Если PHPStan или Psalm добавлены как зависимости в composer.json, то рядом с ними будет значок гаечного ключа, открывающий настройки инструмента.



Оттуда можно перейти к настройкам инспекции и включить подсветку в редакторе. Это делается выбором соответствующей инспекции в списке PHP | Quality tools в Settings/Preferences | Editor | Inspections.

Лучше включить только один из инструментов, а не оба одновременно.



Тут же можно указать путь к конфигурационному файлу и настроить аргументы командной строки.

PHPStan может работать без конфигурационного файла, а для Psalm он требуется обязательно. Если в корневом каталоге есть psalm.xml или phpstan.neon, PhpStorm подтянет их автоматически.

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



Аннотации


Все псалмовские аннотации @psalm-* теперь корректно подсвечиваются в редакторе. Но вообще, теперь можно смело убирать префикс @psalm- из тегов, то есть @psalm-return -> @return и @psalm-param -> @param.



Поддержка типов


Добавили поддержку некоторых типов Psalm и на основе информации из тегов улучшили наш вывод типов. Это сделало более точными проверки, генерацию кода и автодополнение.

Псевдотипы
Поддерживаются псалмовские псевдотипы, такие как scalar, numeric и т. п.



Константы в типах
Пожжерживаются объединения констант и указание через * в тегах param и var.



Тайпхинты для массивов
Описания массивов array<array-key, Type> тоже поддерживаются, в том числе вложенные.



Дженерики и @tempate
Поддержка дженериков фича для продвинутых пользователей, у которой нет полной корректной спецификации и много граничных случаев. Тем не менее мы решили реализовать базовую поддержку для @template на основе синтаксиса Псалма, чтобы посмотреть, как это будет использоваться.

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



Эта поддержка дженериков является очень базовой, ее можно считать экспериментальной. Хотим понять, как это будет использоваться и что нужно реализовать в первую очередь. Будем рады обратной связи, особенно в виде реальных примеров использования в наш трекер.

Xdebug 3


Обновился популярный отладчик для PHP, теперь он значительно быстрее в работе и проще в настройке. Более подробно об Xdebug 3 читайте в документе Upgrade guide.

Чтобы сконфигурировать Xdebug 3, теперь достаточно одной опции xdebug.mode (например так XDEBUG_MODE=debug).

Также был изменен дефолтный порт Xdebug: вместо 9000 теперь 9003. Чтобы упростить миграцию, PhpStorm по умолчанию слушает оба порта. Настройки портов и другие опции для Xdebug находятся в Preferences/Settings | Languages & Frameworks | PHP | Debug.




Улучшения отладчика


Возможности по отладке в PhpStorm расширились двумя новыми фишками.

Интеркактивные хинты
Теперь в отладочном режиме вывод переменных можно развернуть, чтобы увидеть все поля. Тут же можно и изменить значения.



Inline Watches
В предыдущих версиях можно было добавить переменную или выражение в список watch и наблюдать, как меняется значение по шагам.

В PhpStorm 2020.3 можно добавлять вотчи непосредственно к контексте, и они будут отображаться рядом с кодом.

Нажмите Add as Inline Watch в попапе на хинте.


Или нажмите Add Inline Watch в контекстном меню редактора.


Или выделите переменную и в контекстном меню выберите Add Inline Watch.


Подсветка и переименование переменных в Twig


Выберите переменную или поместите на нее курсор, и все ее использования в шаблоне будут подсвечены. А чтобы переименовать все вхождения, нажмите Shift + F6.




Совместная разработка Code With Me


В PhpStorm 2020.3 встроен плагин Code With Me новый инструмент JetBrains для совместной разработки и парного программирования. С помощью него можно расшарить открытый проект с другими пользователями и работать над ним вместе в режиме реального времени. Подробнее про Code With Me в этих постах.




HTTP-клиент


Интеграция Guzzle с HTTP-клиентом в PhpStorm


Guzzle один самых популярных HTTP клиентов для PHP. Представьте, что где-то в коде есть HTTP-запрос и хочется его потестировать, не запуская сам код. Раньше пришлось бы копировать все параметры вручную.

PhpStorm 2020.3 позволяет конвертировать простые запросы Guzzle в файлы .http. Если запрос поддерживается, то рядом с ним появится иконка. Нажав на нее, вы откроете новый scratch-файл с правильным URL, параметрами запроса, методами, заголовками, телом.



Теперь из редактора запрос можно запустить и поиграться с ним, а затем сохранить его как http-файл в проекте.

Больше об HTTP-клиенте в видеообзоре.

Копировать HTTP-запрос в cURL


Чтобы экспортировать HTTP-запрос в cURL-строку, нажмите Alt+Enter на запросе в редакторе и выберите Convert to cURL and copy to clipboard. Теперь его можно вставить в терминал, документацию или любой инструмент тестирования API.




Редактор


Улучшения для Markdown


Для описания диаграмм и графиков можно использовать синтаксис Mermaid.js в markdown-файлах. PhpStorm теперь умеет рендерить превью для них прямо в редакторе. Включается в Preferences/Settings | Languages & Frameworks | Markdown.



Еще теперь можно переформатировать содержимое файлов .md в соответствии с популярными стилями. Делается нажатием L / Ctrl+Alt+L.

Настраивается в Preferences/Settings | Editor | Code Style | Markdown.



И наконец, если нажать кнопку Auto-Scroll Preview в правом верхнем углу редактора, то прокрутка превью и текста будет синхронизирована.

Улучшена проверка орфографии и грамматики


Опечатки и грамматические проблемы теперь можно исправлять намного быстрее:
  • Во-первых, во всплывающем окне появится объяснение ошибки.
  • А если нажать Alt+Enter на подсвеченном тексте, то варианты замены будут предложены наверху, а не спрятаны в подпункт, как раньше.




Сплит редактора перетаскиванием


Чтобы открыть несколько файлов бок о бок, просто перетащите вкладку в нужный угол экрана.



Есть еще один способ открыть файл в сплит-режиме Shift+Enter.
Комбинацию можно нажать на выбранном файле в Project view или в результатах поиска по файлам.



Вкладка предпросмотра


Если нужно быстро просмотреть файлы, то теперь не обязательно открывать каждый в отдельной вкладке. Можно использовать новую вкладку Preview tab.

Чтобы включить ее, нажмите на шестеренку в Project view и выберите Enable Preview Tab и Open Files with Single Click.



Еще можно просматривать файлы нажатием пробела в Project view, не открывая их.




IDE


Улучшения для Search Everywhere



Результаты сгруппированы по релевантности:


Можно делать простые математические операции и не открывать гугл калькулятор:


Можно искать по истории Git:


Автоматическое переключение на светлую или темную тему


В Preferences/Settings | Appearance & Behavior | Appearance | Theme выберите Sync with OS.



Новый набор горячих клавиш для macOS


Альтернативная раскладка горячих клавиш для macOS минимизирует использование функциональных клавиш, чтобы не надо было растягивать руку на всю клавиатуру при совершении основных действий. Например, вместо Fn+Shift+F6 для Rename рефакторинга используется ++R.



Слова вместо иконок для горячих клавиш macOS


Можно сделать так, чтобы вместо иконок типа отображались слова Alt, Cmd и т. п.

Включается в секции Registry опцией ide.macos.disable.native.shortcut.symbols. Чтобы получить доступ к реестру, используйте Find Action Cmd+Shift+A и напишите там Registry.

Установить PhpStorm как приложение по умолчанию для разных файлов


В Preferences | Settings / Editor / File Types нажать Associate file types with PhpStorm. В диалоговом окне выберите расширения для файлов, и они будут открываться в PhpStorm.

На macOS требуется перезагрузка.



Шаблоны могут генерировать несколько файлов


Можно одновременно сгенерировать сразу несколько файлов, например скелет для модуля или комбо контроллер-вью.

В Preferences / Settings | Editor | File and Code Templates нажать на , чтобы создать новый шаблон, а затем нажать на иконку Create Child Template File .

В поле File name можно использовать переменные типа ${NAME}.



А вот пример того, как сгенерировать контроллер и шаблон в Symfony:




Поддержка Git stage


Включить можно чекбоксом Enable staging area в Preferences/Settings | Version Control | Git.

В окне инструментов Commit (Cmd+0 / Alt+0) появятся две группы файлов: staged и unstaged.

Чтобы добавить файл в staged, нажмите на + напротив него.



Или можно выбрать конкретные строки и добавить их иконкой в редакторе. В этом случае можно закоммитить часть изменений из файла, а над остальными продолжить работу.




Инструменты БД


PhpStorm из коробки включает в себя возможности DataGrip, которые охвачены в обзоре релиза DataGrip 2020.3 от наших коллег.

SQL для MongoDB


Теперь можно использовать SQL-запросы к MongoDB. PhpStorm 2020.3 поддерживает SELECT-запросы с JOIN, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, OFFSETи всеми функциями MongoDB кроме map, reduce, filter и let. Подробнее в блог-посте.



Веб


Как всегда, в PhpStorm входят все обновления из WebStorm 2020.3. Наиболее примечательной является поддержка Tailwind CSS.

Tailwind CSS


PhpStorm дополняет классы Tailwind в HTML-файлах и после директивы @apply. А также предоставит автодополнение псевдо-классов.

tailwind-completion-after-apply

Если навести указатель на класс в HTML и CSS файлах, то отобразится предпросмотр полученного CSS. Предпросмотр также доступен при автодополнении кода, во всплывающем окне документации F1 / Ctrl+Q.

tailwind-completion-for-pseudo-class-variants

PhpStorm поддерживает настройки из tailwind.config.js. Например, если определить тему с новыми цветами, то во всплывающем окне автодополнения будут созданные классы с именем кастомного цвета.

tailwind-customization-support




Скачать PhpStorm 2020.3 можно на странице Whats new.

А вот видеоролик (на английском) с демонстрацией главных фич релиза:


На этом всё на этот раз. Будем рады вопросам, пожеланиям, баг-репортам и просто мыслям в комментариях.
Подробнее..

Recovery mode Запускаем php 8 с jit через docker за 5 минут

15.08.2020 02:16:25 | Автор: admin
Зима близко! А вместе с ней близится и релиз php 8. Если вам не терпится протестировать свой код в beta версии php 8, а заодно пощупать jit, то прошу под кат.

TL:DR;


Все примеры можно скачать с github и сразу запустить: github.com/xtrime-ru/php8-test

Подготовка


Для начала потребуется поставить docker и docker-compose.

Теперь создадим opcache.ini файл, который включит opcache и JIT в нашем контейнере.
; Extended PHP.ini file to enable JIT.; ====================================; Place this file under /usr/local/etc/php/conf.d/zend_extension=opcache.soopcache.enable=1opcache.enable_cli=1opcache.jit_buffer_size=32Mopcache.jit=1235


Теперь в рабочей папке нужно создать Dockerfile.
Список пакетов и расширений приведен для примера. Можно удалить эти строки или указать нужные именно вам расширения. Так же часть популярных расширений уже включена в базовый образ. Так что подключать json, xml и многие другие не требуется.

FROM php:8.0-rc-cliCOPY opcache.ini /usr/local/etc/php/conf.d/RUN apt-get update && apt-get upgrade -y \    && apt-get install apt-utils -y \##    устанавливаем необходимые пакеты    && apt-get install git zip vim libzip-dev libgmp-dev libffi-dev libssl-dev -y \##    Включаем необходимые расширения    && docker-php-ext-install -j$(nproc) sockets zip gmp pcntl bcmath ffi \##    Расшерения через pecl ставятся так, то в php 8 pecl сейчас отсутствует, так что строки закоментированы#    && PHP_OPENSSL=yes pecl install ev \#    && docker-php-ext-enable ev \##    Чистим временные файлы    && docker-php-source delete \    && apt-get autoremove --purge -y && apt-get autoclean -y && apt-get clean -y


Остался последний файл. Это docker-compose.yml, который позволяет легко управлять контейнерами при разработке.

version: '3.5'services:  php8-test:    build: ./    container_name: php8-test    restart: unless-stopped    volumes:      - ./:/app    working_dir: /app    entrypoint: "php -S 0.0.0.0:8000"    ports:      - "127.0.0.1:8000:8000"    logging:      driver: "json-file"      options:        max-size: "1024k"        max-file: "2"


Теперь можно запускать сборку контейнера и тесты.

  1. Собираем образ: docker-compose build
  2. Запускаем контейнер в фоне: docker-compose up -d
  3. Подключаемся к контейнеру: docker exec -it php8-test /bin/bash
  4. Текущая папка на контейнере синхронизирована с папкой проекта. Файлы можно редактировать на локальной машине.
  5. Скачиваем файл бенчмарка: github.com/php/php-src/blob/master/Zend/bench.php
  6. Запускаем бенч: php bench.php
  7. Можно отключить jit или opcache внутри контейнера тут: /usr/local/etc/php/conf.d/opcache.ini, что бы посмотреть, как изменится производительность
  8. В docker-compose.yml можно изменить директивы `volumes` и `workdir`, что бы залинковать другие директории в контейнер. Так же можно поменять entrypoint для запуска другой команды при старте контейнера. Например `php artisan serve` для laravel.
  9. Все файлы так же можно посмотреть в браузере по адресу http://127.0.0.1:8000/
    За это отвечают директивы entrypoint и ports.


Бенчмарк


Файл бенчмарка из оффициального репозитория php: github.com/php/php-src/blob/master/Zend/bench.php

########################## php 7.4.9# opcache.enable=1# opcache.enable_cli=0simple             0.053simplecall         0.007simpleucall        0.019simpleudcall       0.022mandel             0.182mandel2            0.220ackermann(7)       0.038ary(50000)         0.006ary2(50000)        0.005ary3(2000)         0.045fibo(30)           0.069hash1(50000)       0.014hash2(500)         0.008heapsort(20000)    0.036matrix(20)         0.034nestedloop(12)     0.089sieve(30)          0.014strcat(200000)     0.006------------------------Total              0.867########################## php 7.4.9# opcache.enable=1# opcache.enable_cli=1simple             0.007simplecall         0.003simpleucall        0.004simpleudcall       0.003mandel             0.088mandel2            0.113ackermann(7)       0.036ary(50000)         0.006ary2(50000)        0.007ary3(2000)         0.039fibo(30)           0.055hash1(50000)       0.012hash2(500)         0.008heapsort(20000)    0.030matrix(20)         0.029nestedloop(12)     0.041sieve(30)          0.011strcat(200000)     0.007------------------------Total              0.499########################## php 8.0-rc# opcache.enable=1# opcache.enable_cli=1# opcache.jit_buffer_size=128M# opcache.jit=1235simple             0.002simplecall         0.001simpleucall        0.001simpleudcall       0.001mandel             0.008mandel2            0.009ackermann(7)       0.016ary(50000)         0.006ary2(50000)        0.007ary3(2000)         0.015fibo(30)           0.030hash1(50000)       0.016hash2(500)         0.011heapsort(20000)    0.014matrix(20)         0.012nestedloop(12)     0.010sieve(30)          0.004strcat(200000)     0.006------------------------Total              0.168


JIT, конечно, сильно ускоряет операции связанные с использованием CPU. Но меня поразило другое. В php по умолчанию используется opcache.enable_cli=0. Если включить эту опцию, то можно получить двухкратный рост в бенчмарке. Лично я не знал о том, что opcache может так ускорять cli команды.

Я проверял несколько раз на чистых контейнерах, а так же с предварительной очисткой opcache. Результат всегда один и тот же: opcache.enable_cli=1 ускоряет бенчмарк начиная с первого запуска.
Подробнее..
Категории: Php , Docker , Php 8 , Jit , Opcache

Новости Yii 2020, выпуск 7

12.11.2020 02:22:21 | Автор: admin

Новости Yii 2020, выпуск 7


Всем привет! Это очередной выпуск новостей Yii. Как обычно, в выпуске вас ждут релизы Yii 2, прогресс Yii 3, важные вести о Yii 1 и другие новости. Приятного чтения и будьте здоровы. Александр Макаров


Фонд


С прошлого выпуска пришлось прилично отвлечься на фонд, а именно на то, как средства перебрасываются из GitHub Sponsors в OpenCollective. С GitHub они уходили нормально, а вот куда большой вопрос. Потребовалось время, чтобы разобраться, но проблему удалось решить.


Ещё одна новость, частично связанная с фондом. Автор httpsoft/http-message, Евгений Зюбин, вероятно присоединится к команде фулл-тайм если/когда это позволит пополнение фонда. Если вы или ваша компания хотите получить Yii 3 раньше, можете помочь.


Инфраструктура


Мы постоянно улучшаем процесс тестирования пакетов:


  • В пакеты со стабильной версией добавлена проверка Roave backwards compatibility.
    Она проверяет что публичный API не сломан по-сравнению с предыдущим стабильным релизом.
  • Мы продолжили перевод тестов с Travis на GitHub actions как для Yii 2, так и для Yii 3. Actions классные, а Travis не так давно порезал поддержку OpenSource. Хорошо что мы начали переход заранее.
  • Мы решили не собирать покрытие кода через PHPUnit с последующей отсылкой его в Scrutinizer CI и теперь генерируем отчёт о покрытии средствами Scrutinizer. Это значительно быстрее, а результат тот же.
  • Отлично себя показал Psalm. Рекомендуем, в том числе, для ваших проектов.
  • В консоль GitHub actions теперь всё выводится в цвете. Выглядит значительно лучше!

Немного правок были сделаны на сайте. Прежде всего это переход на новый метод аутентификации GitHub API. Также был сделан ряд небольших улучшений фронтенда.


Патчи для совместимости с PHPUnit для Yii 2 и Yii 1 переехали в отдельный репозиторий. Если вдруг вам понадобится тестировать приложение на версиях PHP с 5.3 по 8, репозиторий будет определённо полезен.


Yii 1



Yii 2


Был выпущен Yii 2.0.39. В нём есть улучшения DI-контейнера и дополнительные исправления для работы с PHP 8.


Чуть менее заметное улучшение коснулось способа генерации аннотаций для магических свойств. Теперь некоторые IDE, включая PhpStorm, будут отличать свойства только для чтения и только для записи.


Были выпущены новые версии следующих расширений:



Yii 3


С прошлого выпуска были сделаны следующие релизы:



На данный момент мы готовим пакеты из списка в карточке Trello.


Был принят ряд интересных решений:


  • Все стабильные релизы будут начинаться с версии 1.0.0. Ранее рассматривался вариант начинать с 3.0.0.
  • Пакеты Yii 3.0 буду поддерживать PHP 7.4.
  • В большинство пакетов добавлена конфигурация по-умолчанию. Они будут работать сразу после установки без дополнительной конфигурации или с очень минимальной конфигурацией.
  • Провайдеры конфигурации были удалены почти из всех пакетов и приложений.

В Trello есть доска с задачами, над которыми мы работаем, включая не отражённые в GitHub issue.


Почти каждый из пакетов был серьёзно почищен, получил совместимость с PHP 8 и исправления. Ниже представлено самое интересное.


Новые пакеты


Был создан ряд новых пакетов. Часть из них появились в результате выделения общего кода из других пакетов, а часть нет.



Инструменты для разработки


  • Были актуализированы зависимости и добавлен Dockerfile.
  • Реализована возможность полу-автоматического выпуска релизов.

Composer config plugin


Была добавлена временная поддержка PHP 8. Она не заменяет вариант с переписыванием плагина на AST и нужна для того, чтобы облегчить тестирование под PHP 8 в то время как мы занимаемся версией с AST.


Контейнер и фабрика



Кеш



Bulma


  • Больше документации, улучшено именование.
  • Добавлена возможность использовать значки в выпадающем меню.
  • Все виджеты сделаны иммутабельными.

Роутер


  • Внутренности и конфигурация упрощены путём выделения коллекции маршрутов в отдельный класс.
  • Метод UrlMatcherInterface::getLastMatchedRequest() удалён, добавлен getCurrentUri().
  • UrlMatcher теперь является опциональным, что хорошо сочетается с консольными приложениями.

Шаблоны приложений и демо


  • Больше не требуется NodeJs. Ресурсы забираются через asset packagist.
  • Конфиги значительно почищены. В app мы поделили их по разным пакетам.
  • Убрана ссылка контейнера на себя.
  • В yii-demo добавлен Swagger. Открывается через /swagger.
  • yii-demo подвергся рефакторингу.
  • Заменили в yii-demo реализацию PSR-7 на httpsoft/http-message.

Var dumper



Files



Cycle


  • В файловую схему теперь можно писать. Также в неё добавлена поддержка чтения из нескольких файлов.
  • Был задействованы наши DI контейнер / фабрика, так что интеграция с Cycle теперь работает на PHP 8.

Data



DBAL и ActiveRecord


Как DBAL, так и ActiveRecord, портированные с Yii 2, ещё рефакторить и рефакторить несмотря на то, что их серьёзно почистили и они, по большей части, работают.


Arrays



HTML



Debugger



Очереди



Translator


Пакеты i18n помечены как устаревшие, добавлены пакеты translator с новым дизайном.


Новая и изменённая документация



Рекомендации к чтению и другие новости



Спасибо!


Хочу сказать спасибо всем спонсорам и разработчикам, благодаря которым стала возможна разработка Yii 3. Вместе у нас всё получится.


Отдельное спасибо тем, кто помог Yii 3 кодом:


Подробнее..
Категории: Php , Framework , Yii , Php 8 , Yii 2 , Yii 3 , Phpunit

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru