phuture / continuum
A forward-compatibility layer bringing tomorrow’s PHP features to today’s runtimes.
Requires
- php: ^8.0
- league/uri-interfaces: ^2.3.0 || ^7.8.0
- nelexa/zip: ^4.0.0
- nette/robot-loader: ^v4.0.0 || ^v4.1.0
- phpseclib/bcmath_compat: ~v2.0.0
- psr/http-message: ^1.1.0 || ^2.0.0
- rowbot/idna: ^0.1.0 || ^0.3.0
- rowbot/url: ^3.1.0 || ^4.1.0
- symfony/polyfill-apcu: ~v1.37.0
- symfony/polyfill-ctype: ~v1.37.0
- symfony/polyfill-iconv: ~v1.37.0
- symfony/polyfill-intl-grapheme: ~v1.38.0
- symfony/polyfill-intl-icu: ~v1.38.0
- symfony/polyfill-intl-idn: ~v1.38.0
- symfony/polyfill-intl-messageformatter: ~v1.38.0
- symfony/polyfill-intl-normalizer: ~v1.38.0
- symfony/polyfill-mbstring: ~v1.38.0
- symfony/polyfill-php81: ~v1.38.0
- symfony/polyfill-php82: ~v1.38.0
- symfony/polyfill-php83: ~v1.38.0
- symfony/polyfill-php84: ~v1.38.0
- symfony/polyfill-php85: ~v1.38.0
- symfony/polyfill-uuid: ~v1.37.0
- zendtech/polyfill-mb-ereg: ^1.0.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.92.0
- nette/tester: ^2.5
- phpstan/phpstan: ^2.0
- squizlabs/php_codesniffer: ^3.7
Provides
- ext-apcu: *
- ext-bcmath: *
- ext-ctype: *
- ext-iconv: *
- ext-intl: *
- ext-mbstring: *
- ext-uuid: *
- ext-zip: *
Replaces
- league/uri-polyfill: ^7.8.0
README
Phuture Continuum
A forward-compatibility layer bringing tomorrow’s PHP features to today’s runtimes.
Introduction
Continuum bridges the gap between PHP versions by extending Symfony Polyfill with additional methods, constants, and stubs. Built on Symfony's solid foundation, Continuum provides extra polyfills and graceful fallbacks—enabling you to write forward-compatible code that works consistently across different PHP runtimes.
Features
This package polyfills most common PHP functions from PHP 8.1 to 8.5, designed to be used on PHP 8.0 or later.
| Polyfill | Level | Type |
|---|---|---|
| ▶️ PHP 8.1+ | ||
array_is_list() |
✅ Full | Function |
enum_exists() |
✅ Full | Function |
fsync() |
❇️ Partial | Function |
fdatasync() |
❇️ Partial | Function |
IMAGETYPE_AVIF |
✅ Full | Constant |
IMG_AVIF |
✅ Full | Constant |
IMG_WEBP_LOSSLESS |
✅ Full | Constant |
MYSQLI_REFRESH_REPLICA |
✅ Full | Constant |
T_READONLY |
✅ Full | Constant |
CURLStringFile |
✅ Full | Class |
ReturnTypeWillChange |
✅ Full | Attribute |
| ▶️ PHP 8.2+ | ||
ini_parse_quantity() |
✅ Full | Function |
odbc_connection_string_is_quoted() |
✅ Full | Function |
odbc_connection_string_should_quote() |
✅ Full | Function |
odbc_connection_string_quote() |
✅ Full | Function |
curl_upkeep() |
❇️ Partial | Function |
memory_reset_peak_usage() |
⚠️ No-op | Function |
mysqli_execute_query() |
✅ Full | Function |
openssl_cipher_key_length() |
✅ Full | Function |
imap_is_open() |
✅ Full | Function |
AllowDynamicProperties |
✅ Full | Attribute |
SensitiveParameter |
✅ Full | Attribute |
SensitiveParameterValue |
✅ Full | Class |
Random\Engine |
✅ Full | Interface |
Random\CryptoSafeEngine |
✅ Full | Interface |
Random\Engine\Secure |
✅ Full | Class |
| ▶️ PHP 8.3+ | ||
json_validate() |
✅ Full | Function |
mb_str_pad() |
✅ Full | Function |
str_increment() |
✅ Full | Function |
str_decrement() |
✅ Full | Function |
stream_context_set_options() |
✅ Full | Function |
posix_eaccess() |
✅ Full | Function |
POSIX_PC_* (10 constants) |
✅ Full | Constant |
POSIX_*_OK (4 constants) |
✅ Full | Constant |
Override |
✅ Full | Attribute |
DateError / DateException (and related) |
✅ Full | Class |
SQLite3Exception |
✅ Full | Class |
ldap_exop_sync() |
✅ Full | Function |
ldap_connect_wallet() |
✅ Full | Function |
| ▶️ PHP 8.4+ | ||
array_find() |
✅ Full | Function |
array_find_key() |
✅ Full | Function |
array_any() |
✅ Full | Function |
array_all() |
✅ Full | Function |
fpow() |
✅ Full | Function |
grapheme_str_split() |
✅ Full | Function |
PHP_SBINDIR |
✅ Full | Constant |
CURL_HTTP_VERSION_3 |
✅ Full | Constant |
CURL_HTTP_VERSION_3ONLY |
✅ Full | Constant |
Deprecated |
✅ Full | Attribute |
RoundingMode |
✅ Full | Enum |
ReflectionConstant |
✅ Full | Class |
PDO driver subclasses (Dblib, Firebird, etc.) |
✅ Full | Class |
| ▶️ PHP 8.5+ | ||
array_first() |
✅ Full | Function |
array_last() |
✅ Full | Function |
get_error_handler() |
✅ Full | Function |
get_exception_handler() |
✅ Full | Function |
locale_is_right_to_left() |
✅ Full | Function |
grapheme_levenshtein() |
✅ Full | Function |
PHP_BUILD_DATE |
✅ Full | Constant |
PHP_BUILD_PROVIDER |
✅ Full | Constant |
NoDiscard |
✅ Full | Attribute |
DelayedTargetValidation |
✅ Full | Attribute |
Uri\Rfc3986\Uri |
✅ Full | Class |
Uri\WhatWg\Url |
✅ Full | Class |
Uri\WhatWg\InvalidUrlException |
✅ Full | Class |
Uri\WhatWg\UrlValidationError |
✅ Full | Class |
Uri\WhatWg\UrlValidationErrorType |
✅ Full | Class |
Uri\UriException |
✅ Full | Class |
Uri\InvalidUriException |
✅ Full | Class |
Uri\UriComparisonMode |
✅ Full | Class |
Filter\FilterException |
✅ Full | Class |
Filter\FilterFailedException |
✅ Full | Class |
This package also provides polyfills for some PHP extensions, allowing better portability across different PHP runtimes.
| Extension | Level |
|---|---|
ext-mbstring |
⚠️ Partial |
ext-iconv |
✅ Full |
ext-apcu |
⚠️ Partial |
ext-ctype |
✅ Full |
ext-uuid |
✅ Full |
ext-bcmath |
✅ Full |
ext-intl |
⚠️ Partial |
ext-zip |
⚠️ Partial |
What's Not Covered
The entries marked ❇️ Partial or ⚠️ Partial in the tables above have meaningful gaps. This section documents exactly what each one omits or cannot replicate.
Partial Polyfills
fsync() / fdatasync() (PHP 8.1)
- Both fall back to
fflush(), plusposix_fsync()when theposixextension is loaded. - There is no guarantee of actual disk-level synchronization on systems without the POSIX extension.
- The return value is always
true, even when the underlying OS sync did not occur.
curl_upkeep() (PHP 8.2)
- Only sets
CURLOPT_FORBID_REUSE = falseandCURLOPT_FRESH_CONNECT = false. - Does not perform real HTTP/2 connection maintenance (window-size updates, PING frames, or keep-alive signalling).
- Full behaviour requires PHP 8.2+ with libcurl ≥ 7.62.0.
Partial Extensions
ext-mbstring
- The only functions with no polyfill are the stateful regex-search family:
mb_ereg_search(),mb_ereg_search_init(),mb_ereg_search_pos(),mb_ereg_search_regs(),mb_ereg_search_getpos(),mb_ereg_search_getregs(), andmb_ereg_search_setpos(). mb_convert_kana()supports only theR,r,N,n,K,k,V,A,aconversion modes.
ext-apcu
- In-memory, non-persistent cache: data is lost between requests.
- Scoped to a single process; entries are not shared across PHP-FPM workers.
- No atomic operations beyond basic
get/set; no TTL-based eviction or shared-memory sizing.
ext-intl
Collator: simplified sorting - does not implement the full Unicode Collation Algorithm.NumberFormatter: advanced formatting features (currency symbol overrides, padding, significant digits) are missing.Locale: operations are simplified; no full CLDR data lookup.- No direct access to ICU binary data; limited to the subset bundled with Symfony.
ext-zip
ZipArchive::getArchiveFlag()- always returns0; archive-level flags are a libzip internal concept not accessible through userland php.ZipArchive::setArchiveFlag()- always returnsfalse.ZipArchive::registerProgressCallback()- always returnsfalse.ZipArchive::registerCancelCallback()- always returnsfalse.- Procedural
zip_entry_open()only accepts modesrandrb; write-mode entry access is not supported. - Multi-disk ZIP archives are not supported.
- Writing with compression methods
CM_LZMA,CM_LZMA2, andCM_XZis not supported.
Installation
composer require phuture/continuum
Contributing
Thank you for considering contributing to this project! You can read the Contribution Guide and our Developer Workflow Guide.
Code of Conduct
This project follows a Code of Conduct that all community members and contributors are expected to adhere to our Contributor Code of Conduct.
License
This project is open-source and available under the MIT License.