Объявления типов Symfony, возвращаемые типы и совместимость с PHPUnit

Если вы следите за категорией Living on the Edge блога Symfony, вы найдете все самые последние и самые новые функции каждой версии Symfony. Большие и маленькие функции, которые помогут вам создавать ваши проекты, имея при этом наилучшие возможности для разработчиков.

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

Добавлены объявления типов PHP

Объявления типов PHP (или «подсказки типов») добавляют информацию о типах данных аргументов функции и метода. В коде Symfony еще не было объявлений типов, потому что, согласно процессу выпуска Symfony, мы не можем сразу добавить последние функции PHP, и нам нужно подождать, пока не будут выпущены определенные версии Symfony, чтобы внести эти изменения.

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

Причина в том, что речь идет не только об удалении комментариев PHPdoc и добавлении типов в аргументы метода. Вам также необходимо проверить остальную часть кода, чтобы найти приведение типов данных. Например:

-/**
- * @param bool|null $enabled
- */
-public function setStrictRequirements($enabled)
+public function setStrictRequirements(?bool $enabled)
{
-    $this->strictRequirements = null === $enabled ? null : (bool) $enabled;
+    $this->strictRequirements = $enabled;

Посмотрите Запрос на слияние #32179, чтобы получить представление о размере этого изменения. Десятки тысяч строк были изменены в тысячах файлов, и десятки часов были потрачены на просмотр и объединение всего.

Спасибо @jschaedl, @Simperfit, @Tobion, @Matts, @smoench, @vudaltsov, @julien57, @azjezz, @tigitz, @andreia, @thomasbisignani, @lyrixx, @xabbuh за внесение этих изменений. Особая благодарность @derrabus за координацию работы и @nicolas-grekas за фактическое слияние и разрешение конфликтов.

Добавлены типы возвращаемых данных

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

  • Бремя, которое это может наложить на сообщество, огромно, потому что сторонние библиотеки и пакеты также должны быть обновлены, чтобы быть совместимыми с этим новым кодом Symfony, который включает типы возврата. Другими словами, Symfony должен быть последним, чтобы добавить эти возвращаемые типы, а не первым.
  • Учитывая сложность и гибкость кодовой базы Symfony, нам потребуется ковариация возвращаемого типа, которая доступна только в PHP 7.4 (Symfony 5.x требует PHP 7.2).

В любом случае у нас есть план добавить эти типы возвращаемых данных в Symfony 6.0. Посмотрите Запрос на слияния #33236, чтобы увидеть хитрый трюк, используемый для автоматического добавления этих типов возврата благодаря DebugClassLoader. Отдельное спасибо @fancyweb за исправление всех текущих типов возвращаемых данных, определенных в комментариях PHPdoc (см. Запрос на слияние #30323).

Добавлена совместимость со всеми версиями PHP и PHPUnit

Последняя функция, которая требовала безумного объема работы, но разработчики считают это само собой разумеющимся, это совместимость PHPUnit Bridge со всеми версиями PHP от 5.5 до 7.4 и всеми версиями PHPUnit от 4.8 до 8.0.

Как упоминалось в «Новое в Symfony 4.4: PHPUnit Polyfills», добавили множество полизаполнений, чтобы сделать большинство функций PHPUnit доступными независимо от версии PHPUnit, используемой в вашем приложении. Это необходимо для собственного тестирования Symfony, но также поможет тем приложениям, которые должны поддерживать широкую совместимость с устаревшими версиями PHP и PHPUnit.

Посмотрите запрос на слияние #32844, чтобы увидеть десятки связанных запросов на слияния, которые были необходимы для достижения этой цели. Отдельное спасибо @jderusse, который сделал большую часть работы, связанной с этой функцией.