symfony / polyfill

Symfony polyfill 将新版本PHP的特性向下兼容到旧版本


README

此项目将最新PHP版本中发现的功能向下兼容,并为某些扩展和函数提供兼容层。当需要跨PHP版本和扩展的便携性时,可使用此项目。

提供的polyfills包括:

  • 当安装了旧版 apc 扩展时,为 apcu 扩展提供;
  • 当PHP编译时没有ctype时,为 ctype 扩展提供;
  • mbstringiconv 扩展提供;
  • uuid 扩展提供;
  • MessageFormatter 类和 msgfmt_format_message 函数提供;
  • Normalizer 类和 grapheme_* 函数提供;
  • xml 扩展或PHP-7.2核心提供的 utf8_encodeutf8_decode 函数;
  • CollatorNumberFormatterLocaleIntlDateFormatter 类提供,限于 "en" 区域设置;
  • intl_error_nameintl_get_error_codeintl_get_error_messageintl_is_failure 函数提供;
  • idn_to_asciiidn_to_utf8 函数提供;
  • 当需要与 mbstring.func_overload 兼容时,提供 Binary 工具类;
  • 引入了PHP 7.2的 spl_object_idstream_isatty 函数;
  • mbstring 扩展引入了PHP 7.2的 mb_ordmb_chrmb_scrub 函数;
  • PHP 7.2中引入了仅适用于Windows的 sapi_windows_vt100_support 函数;
  • PHP 7.2中引入了 PHP_FLOAT_* 常量;
  • PHP 7.2中引入了 PHP_OS_FAMILY 常量;
  • PHP 7.3中引入了 is_countable 函数;
  • PHP 7.3中引入了 array_key_firstarray_key_last 函数;
  • PHP 7.3中引入了 hrtime 函数;
  • PHP 7.3中引入了 JsonException 类;
  • PHP 7.4中引入了 get_mangled_object_varsmb_str_splitpassword_algos 函数;
  • PHP 8.0中引入了 fdiv 函数;
  • PHP 8.0中引入了 get_debug_type 函数;
  • PHP 8.0中引入了 preg_last_error_msg 函数;
  • PHP 8.0中引入了 str_contains 函数;
  • PHP 8.0中引入了 str_starts_withstr_ends_with 函数;
  • PHP 8.0中引入了 ValueError 类;
  • PHP 8.0中引入了 UnhandledMatchError 类;
  • PHP 8.0中引入了 FILTER_VALIDATE_BOOL 常量;
  • PHP 8.0中引入了 get_resource_id 函数;
  • PHP 8.0中引入了 Attribute 类;
  • PHP 8.0中引入了 Stringable 接口;
  • 当启用tokenizer扩展时,PHP 8.0中引入了 PhpToken 类;
  • PHP 8.1中引入了 array_is_list 函数;
  • PHP 8.1中引入了 enum_exists 函数;
  • PHP 8.1中引入了 MYSQLI_REFRESH_REPLICA 常量;
  • PHP 8.1中引入了 ReturnTypeWillChange 属性。
  • PHP 8.1 中引入的 CURLStringFile 类(但仅当使用 PHP >= 7.4 时有效);
  • PHP 8.2 中引入的 AllowDynamicProperties 属性;
  • PHP 8.2 中引入的 SensitiveParameter 属性;
  • PHP 8.2 中引入的 SensitiveParameterValue 类;
  • PHP 8.2 中引入的 Random\Engine 接口;
  • PHP 8.2 中引入的 Random\CryptoSafeEngine 接口;
  • PHP 8.2 中引入的 Random\Engine\Secure 类(检查 arokettu/random-polyfill 了解更多引擎);
  • PHP 8.2 中引入的 odbc_connection_string_is_quoted 函数;
  • PHP 8.2 中引入的 odbc_connection_string_should_quote 函数;
  • PHP 8.2 中引入的 odbc_connection_string_quote 函数;
  • PHP 8.2 中引入的 ini_parse_quantity 函数;
  • PHP 8.3 中引入的 json_validate 函数;
  • PHP 8.3 中引入的 Override 属性;
  • PHP 8.3 中引入的 mb_str_pad 函数;
  • PHP 8.3 中引入的 ldap_exop_sync 函数;
  • PHP 8.3 中引入的 ldap_connect_wallet 函数;
  • PHP 8.3 中引入的 stream_context_set_options 函数;
  • PHP 8.3 中引入的 str_incrementstr_decrement 函数;
  • PHP 8.3 中引入的 Date*Exception/Error 类;
  • PHP 8.3 中引入的 SQLite3Exception 类;
  • PHP 8.4 中引入的 mb_ucfirstmb_lcfirst 函数;
  • PHP 8.4 中引入的 array_findarray_find_keyarray_anyarray_all 函数;
  • PHP 8.4 中引入的 Deprecated 属性;
  • PHP 8.4 中引入的 mb_trimmb_ltrimmb_rtrim 函数;
  • PHP 8.4 中引入的 CURL_HTTP_VERSION_3CURL_HTTP_VERSION_3ONLY 常量;

强烈建议尽可能升级您的 PHP 版本并/或安装缺少的扩展。此 polyfill 应仅在没有更好的选择或当可移植性是一个要求时使用。

兼容性说明

要编写在 PHP5 和 PHP7 之间可移植的代码,必须注意一些事项

  • 必须在 \Exception 之前捕获 \*Error 异常;
  • 在调用 error_clear_last() 之后,必须使用 isset($e['message'][0]) 验证 $e = error_get_last() 的结果,而不是 null !== $e

用法

当使用 Composer 管理您的依赖项时,您应该 require symfony/polyfill 包,而是单独的包

  • symfony/polyfill-apcu 用于使用 apcu_* 函数,
  • symfony/polyfill-ctype 用于使用 ctype 函数,
  • 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-php71 用于使用 PHP 7.1 函数,
  • symfony/polyfill-php72 用于使用 PHP 7.2 函数,
  • symfony/polyfill-php73 用于使用 PHP 7.3 函数,
  • symfony/polyfill-php74 用于使用 PHP 7.4 函数,
  • symfony/polyfill-php80 用于使用 PHP 8.0 函数,
  • symfony/polyfill-php81 用于使用 PHP 8.1 函数,
  • symfony/polyfill-php82 用于使用 PHP 8.2 函数,
  • symfony/polyfill-php83 用于使用 PHP 8.3 函数,
  • symfony/polyfill-php84 用于使用 PHP 8.4 函数,
  • symfony/polyfill-iconv 用于使用 iconv 函数,
  • symfony/polyfill-intl-grapheme 用于使用 grapheme_* 函数,
  • symfony/polyfill-intl-idn 用于使用 idn_to_asciiidn_to_utf8 函数,
  • symfony/polyfill-intl-icu 用于使用 intl 函数和类,
  • symfony/polyfill-intl-messageformatter 用于使用 intl messageformatter,
  • symfony/polyfill-intl-normalizer 用于使用 intl normalizer,
  • symfony/polyfill-mbstring 用于使用 mbstring 函数,
  • symfony/polyfill-util 用于使用 polyfill 工具助手。
  • symfony/polyfill-uuid 用于使用 uuid_* 函数。

直接要求 symfony/polyfill 会导致 Composer 无法在依赖图中正确共享填充项。因此,可能会安装比所需更多的代码。

设计

此包旨在实现低开销和高质量的填充。

它仅向引导过程添加少量轻量级的 require 语句以支持所有填充。实现将在代码执行期间按需加载。

如果您的项目需要最低 PHP 版本,建议将较低 PHP 版本的填充项添加到 composer.jsonreplace 部分中。这将从这些填充项中移除任何开销,因为它们不再是您项目的一部分。同样,您可以为所需的扩展的填充项执行此操作。

如果您的项目需要 PHP 7.0 并需要 mb 扩展,replace 部分可能看起来像这样

{
    "replace": {
        "symfony/polyfill-php54": "*",
        "symfony/polyfill-php55": "*",
        "symfony/polyfill-php56": "*",
        "symfony/polyfill-php70": "*",
        "symfony/polyfill-mbstring": "*"
    }
}

填充项将与它们的原生实现一起进行单元测试,以确保功能和行为的兼容性,并在长期内得到验证和强制执行。

许可证

此库在 MIT 许可证 下发布。