В веб-разработке, polyfill это «дополнительный код, который предоставляет средства, которые не встроены в веб-браузер«. Они дико популярны в приложениях JavaScript, поскольку они обеспечивают равномерное API независимо от возможностей, предоставляемых браузерами пользователей.
Это проблема, с которым Symfony все чаще сталкивается, так как все более разнообразные версии PHP приходится поддерживать, от древнего PHP 5.3.3 (выпущен в июле 2010 года!) до ультрасовременного PHP 7.0. Различия в этих версиях PHP заставило нас включить много проверок версий PHP:
if (PHP_VERSION_ID >= 50400) { session_register_shutdown(); } else { register_shutdown_function('session_write_close'); }
Нам также необходимо выполнять множество проверок функций, поскольку некоторые важные расширения PHP могут быть выключены при выполнении приложений Symfony:
if (function_exists('mb_strlen')) { $params[$index] = mb_substr(...); } else { $params[$index] = substr(...); } // ...
Введение в PHP Polyfills
Поддержка пяти различных PHP версий в большой кодовой базе Symfony начало превращать процесс поддержки в ад. По этой причине мы решили создать несколько небольших polyfill компонентов, чтобы «заполнить пробелы» из PHP версий 5.x и недостающих расширений.
Например, чтобы использовать некоторые из замечательных новых функций PHP, предоставляемые в PHP 7.0 в любом приложении на PHP 5.x, вам просто необходимо установить компонент symfony/polyfill-php70
:
$ composer require symfony/polyfill-php70
Теперь ваш проект может начать использовать эти функции включены изначально в PHP 7 и предоставляемые в PHP 5.x код с помощью этого компонента:
intdiv()
preg_replace_callback_array()
error_clear_last()
random_bytes()
andrandom_int()
Этот PHP 7 polyfill также предоставляет * Error Throwable классы.
Выберите свой PHP polyfill
Проект Symfony уже опубликовал 12 отдельных компонентов polyfill, которые могут быть использованы в приложениях:
- symfony/polyfill-apcu для использования
apcu_*()
функций, - symfony/polyfill-php54 для использования новых функций, включенных в PHP 5.4,
- symfony/polyfill-php55 для использования новых функций, включенных в PHP 5.5,
- symfony/polyfill-php56 для использования новых функций, включенных в PHP 5.6,
- symfony/polyfill-php70 для использования новых функций, включенных в PHP 7.0,
- symfony/polyfill-iconv для использование
iconv
функций, - symfony/polyfill-intl-grapheme для использование
grapheme_*()
функций, - symfony/polyfill-intl-icu для использование
intl
функций и классов, - symfony/polyfill-intl-normalizer для использование
intl
нормализатора, - symfony/polyfill-mbstring для использование
mbstring
функций, - symfony/polyfill-util для использование polyfill утилит помощьников,
- symfony/polyfill-xml для использование
utf8_encode()/decode()
функций.
Как вы можете видеть в этом pull request, использование всех этих polyfills позволили Symfony 2.8, удалить около 800 строк кода.
Следующие PHP polyfills
Если вы считаете, что некоторые другие polyfill могут быть полезны для Symfony или PHP в целом, поднять вопрос в главном symfony/polyfill
репозитории и попросить об этом. Вы также можете предложить свой собственный код polyfill, если он соответствует стандарту качества Symfony и обеспечивает паритет поведения с родной версией.
Источник: http://symfony.com/blog/new-in-symfony-2-8-polyfill-components