Top Related Projects
The Symfony PHP framework
PHP 5.x support for random_bytes() and random_int()
Compatibility with the password_* functions that ship with PHP 5.5
All PHP functions, rewritten to throw exceptions instead of returning false
Quick Overview
The Symfony Polyfill project is a set of PHP classes that provide functionality missing from the current version of PHP. It aims to provide a consistent set of functions and classes that can be used across different versions of PHP, allowing developers to write code that works on a wide range of PHP environments.
Pros
- Compatibility: The Symfony Polyfill project helps ensure that your code works consistently across different versions of PHP, reducing the need for complex version-specific logic.
- Standardization: By providing a consistent set of functions and classes, the Symfony Polyfill project helps to standardize the way developers interact with certain PHP features, making it easier to write and maintain code.
- Extensibility: The Symfony Polyfill project is designed to be easily extended, allowing developers to add support for new PHP features as they are introduced.
- Community Support: The Symfony Polyfill project is maintained by the Symfony community, which means that it benefits from a large and active user base, as well as regular updates and bug fixes.
Cons
- Dependency: Using the Symfony Polyfill project means that your code will have an additional dependency, which can increase the complexity of your project's setup and deployment.
- Performance: The Symfony Polyfill project may introduce a small amount of overhead, as it needs to provide functionality that is not natively available in the current version of PHP.
- Maintenance: As the Symfony Polyfill project needs to keep up with changes in PHP, it may require regular updates to ensure that it continues to work as expected.
- Scope: The Symfony Polyfill project may not cover every single feature that is missing from the current version of PHP, so developers may still need to write custom code to handle certain use cases.
Code Examples
Here are a few examples of how you can use the Symfony Polyfill project in your PHP code:
// Using the Symfony Polyfill for the `mb_str_split()` function
use Symfony\Polyfill\Mbstring\Mbstring;
$string = 'Hello, World!';
$chars = Mbstring::str_split($string, 1);
print_r($chars);
This code uses the Mbstring class from the Symfony Polyfill project to split a string into an array of individual characters, even on systems where the native mb_str_split() function is not available.
// Using the Symfony Polyfill for the `is_iterable()` function
use Symfony\Polyfill\Php70\Php70;
$data = [1, 2, 3, 4, 5];
if (Php70::is_iterable($data)) {
foreach ($data as $item) {
echo $item . ' ';
}
}
This code uses the Php70 class from the Symfony Polyfill project to check if a variable is iterable, which is a feature that was introduced in PHP 7.0. This allows the code to work on older versions of PHP that do not have the native is_iterable() function.
// Using the Symfony Polyfill for the `mb_chr()` function
use Symfony\Polyfill\Mbstring\Mbstring;
$character = Mbstring::chr(0x2603);
echo $character; // Output: ☃
This code uses the Mbstring class from the Symfony Polyfill project to get the Unicode character for a given code point, which is a feature that was introduced in PHP 7.2. This allows the code to work on older versions of PHP that do not have the native mb_chr() function.
Getting Started
To use the Symfony Polyfill project in your PHP code, you can install it using Composer:
composer require symfony/polyfill
Once you have installed the Symfony Polyfill project, you can start using the provided classes and functions in your code. The specific classes and functions that you need to use will depend on the PHP features that you are trying to access.
For example, to use the mb_str_split() function, you would need to include the Symfony\Polyfill\Mbstring\Mbstring class and call the `str
Competitor Comparisons
The Symfony PHP framework
Pros of symfony
- Comprehensive full-stack framework with extensive features and components
- Highly modular architecture allowing for flexible usage and customization
- Large, active community providing support and continuous development
Cons of symfony
- Larger footprint and potentially steeper learning curve
- May include unnecessary components for smaller projects
- Higher resource requirements for deployment and execution
Code Comparison
symfony:
use Symfony\Component\HttpFoundation\Response;
$response = new Response();
$response->setContent('<html><body>Hello, World!</body></html>');
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'text/html');
polyfill:
if (!function_exists('mb_strlen')) {
function mb_strlen($string, $encoding = null) {
return \Symfony\Polyfill\Mbstring\Mbstring::mb_strlen($string, $encoding);
}
}
The symfony example showcases a more feature-rich approach to handling HTTP responses, while the polyfill example demonstrates a simple function implementation for cross-version compatibility.
symfony offers a complete framework solution, whereas polyfill focuses on providing backward compatibility for specific PHP functions across different versions.
PHP 5.x support for random_bytes() and random_int()
Pros of random_compat
- Focused specifically on providing secure random number generation
- Extensively audited for security vulnerabilities
- Includes comprehensive unit tests and continuous integration
Cons of random_compat
- Limited scope compared to Polyfill's broader feature set
- May require additional dependencies for full functionality
- Less frequent updates and maintenance
Code Comparison
random_compat:
$bytes = random_bytes(32);
$integer = random_int(0, 100);
Polyfill:
use Symfony\Polyfill\Php70\Php70;
$bytes = Php70::random_bytes(32);
$integer = Php70::random_int(0, 100);
Key Differences
- Polyfill provides a wider range of PHP compatibility features
- random_compat focuses solely on secure random number generation
- Polyfill integrates seamlessly with Symfony framework
- random_compat offers more detailed documentation on cryptographic security
Use Cases
- Choose random_compat for projects requiring only secure random number generation
- Opt for Polyfill when needing broader PHP compatibility features
- Consider Polyfill for Symfony-based projects for better integration
Community and Support
- Polyfill has a larger community and more frequent updates
- random_compat benefits from security-focused maintainers and audits
Both libraries serve important roles in PHP development, with random_compat excelling in secure random number generation and Polyfill offering a comprehensive set of compatibility features.
Compatibility with the password_* functions that ship with PHP 5.5
Pros of password_compat
- Focused specifically on password hashing compatibility
- Lightweight and easy to integrate for projects only needing password functionality
- Provides a straightforward implementation of the password_* functions
Cons of password_compat
- Limited scope compared to Polyfill's broader range of PHP compatibility features
- Less frequently updated, with the last commit being several years old
- May not be necessary for newer PHP versions that already include these functions
Code Comparison
password_compat:
$hash = password_hash("password", PASSWORD_DEFAULT);
if (password_verify("password", $hash)) {
echo "Password is valid!";
}
Polyfill:
use Symfony\Polyfill\Php54\Php54;
$hash = Php54::hash_pbkdf2("sha256", "password", "salt", 1000, 20);
if (hash_equals($hash, Php54::hash_pbkdf2("sha256", "password", "salt", 1000, 20))) {
echo "Password is valid!";
}
Summary
While password_compat provides a targeted solution for password hashing compatibility, Polyfill offers a more comprehensive set of polyfills for various PHP versions. password_compat is simpler to use for projects only needing password functionality, but Polyfill is more actively maintained and covers a broader range of compatibility issues. The choice between them depends on the specific needs of your project and the PHP versions you need to support.
All PHP functions, rewritten to throw exceptions instead of returning false
Pros of Safe
- Provides type-safe wrappers for PHP functions, enhancing code reliability
- Throws exceptions instead of returning false or null on errors, improving error handling
- Offers a more consistent API for PHP functions
Cons of Safe
- Limited to wrapping existing PHP functions, not providing new functionality
- Requires learning a new API for familiar PHP functions
- May have a slight performance overhead due to additional function calls
Code Comparison
Safe:
use function Safe\file_get_contents;
$content = file_get_contents('file.txt');
// Throws exception on failure
Polyfill:
$content = file_get_contents('file.txt');
if ($content === false) {
// Manual error handling required
}
Key Differences
- Safe focuses on improving PHP's native functions, while Polyfill aims to provide compatibility layers for newer PHP features in older versions
- Polyfill is more widely used and maintained by the Symfony community
- Safe requires explicit use of its functions, whereas Polyfill works transparently in the background
Use Cases
- Use Safe when prioritizing type safety and consistent error handling in your project
- Choose Polyfill when needing to support multiple PHP versions or use newer language features in older environments
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Symfony Polyfill
This project backports features found in the latest PHP versions and provides compatibility layers for some extensions and functions. It is intended to be used when portability across PHP versions and extensions is desired.
Polyfills are provided for:
- the
apcuextension when the legacyapcextension is installed; - the
ctypeextension when PHP is compiled without ctype; - the
mbstringandiconvextensions; - the
uuidextension; - the
MessageFormatterclass and themsgfmt_format_messagefunctions; - the
Normalizerclass and thegrapheme_*functions; - the
utf8_encodeandutf8_decodefunctions from thexmlextension or PHP-7.2 core; - the
Collator,NumberFormatter,LocaleandIntlDateFormatterclasses, limited to the "en" locale; - the
intl_error_name,intl_get_error_code,intl_get_error_messageandintl_is_failurefunctions; - the
idn_to_asciiandidn_to_utf8functions; - a
Binaryutility class to be used when compatibility withmbstring.func_overloadis required; - the
spl_object_idandstream_isattyfunctions introduced in PHP 7.2; - the
mb_ord,mb_chrandmb_scrubfunctions introduced in PHP 7.2 from thembstringextension - the
sapi_windows_vt100_supportfunction (Windows only) introduced in PHP 7.2; - the
PHP_FLOAT_*constant introduced in PHP 7.2; - the
PHP_OS_FAMILYconstant introduced in PHP 7.2; - the
is_countablefunction introduced in PHP 7.3; - the
array_key_firstandarray_key_lastfunctions introduced in PHP 7.3; - the
hrtimefunction introduced in PHP 7.3; - the
JsonExceptionclass introduced in PHP 7.3; - the
get_mangled_object_vars,mb_str_splitandpassword_algosfunctions introduced in PHP 7.4; - the
fdivfunction introduced in PHP 8.0; - the
get_debug_typefunction introduced in PHP 8.0; - the
preg_last_error_msgfunction introduced in PHP 8.0; - the
str_containsfunction introduced in PHP 8.0; - the
str_starts_withandstr_ends_withfunctions introduced in PHP 8.0; - the
ValueErrorclass introduced in PHP 8.0; - the
UnhandledMatchErrorclass introduced in PHP 8.0; - the
FILTER_VALIDATE_BOOLconstant introduced in PHP 8.0; - the
get_resource_idfunction introduced in PHP 8.0; - the
Attributeclass introduced in PHP 8.0; - the
Stringableinterface introduced in PHP 8.0; - the
PhpTokenclass introduced in PHP 8.0 when the tokenizer extension is enabled; - the
array_is_listfunction introduced in PHP 8.1; - the
enum_existsfunction introduced in PHP 8.1; - the
MYSQLI_REFRESH_REPLICAconstant introduced in PHP 8.1; - the
ReturnTypeWillChangeattribute introduced in PHP 8.1; - the
CURLStringFileclass introduced in PHP 8.1 (but only if PHP >= 7.4 is used); - the
AllowDynamicPropertiesattribute introduced in PHP 8.2; - the
SensitiveParameterattribute introduced in PHP 8.2; - the
SensitiveParameterValueclass introduced in PHP 8.2; - the
Random\Engineinterface introduced in PHP 8.2; - the
Random\CryptoSafeEngineinterface introduced in PHP 8.2; - the
Random\Engine\Secureclass introduced in PHP 8.2 (check arokettu/random-polyfill for more engines); - the
odbc_connection_string_is_quotedfunction introduced in PHP 8.2; - the
odbc_connection_string_should_quotefunction introduced in PHP 8.2; - the
odbc_connection_string_quotefunction introduced in PHP 8.2; - the
ini_parse_quantityfunction introduced in PHP 8.2; - the
json_validatefunction introduced in PHP 8.3; - the
Overrideattribute introduced in PHP 8.3; - the
mb_str_padfunction introduced in PHP 8.3; - the
ldap_exop_syncfunction introduced in PHP 8.3; - the
ldap_connect_walletfunction introduced in PHP 8.3; - the
stream_context_set_optionsfunction introduced in PHP 8.3; - the
str_incrementandstr_decrementfunctions introduced in PHP 8.3; - the
Date*Exception/Errorclasses introduced in PHP 8.3; - the
SQLite3Exceptionclass introduced in PHP 8.3; - the
mb_ucfirstandmb_lcfirstfunctions introduced in PHP 8.4; - the
array_find,array_find_key,array_anyandarray_allfunctions introduced in PHP 8.4; - the
Deprecatedattribute introduced in PHP 8.4; - the
mb_trim,mb_ltrimandmb_rtrimfunctions introduced in PHP 8.4; - the
ReflectionConstantclass introduced in PHP 8.4 - the
CURL_HTTP_VERSION_3andCURL_HTTP_VERSION_3ONLYconstants introduced in PHP 8.4; - the
grapheme_str_splitfunction introduced in PHP 8.4; - the
bcdivmodfunction introduced in PHP 8.4; - the
get_error_handlerandget_exception_handlerfunctions introduced in PHP 8.5; - the
NoDiscardattribute introduced in PHP 8.5; - the
array_firstandarray_lastfunctions introduced in PHP 8.5; - the
DelayedTargetValidationattribute introduced in PHP 8.5;
It is strongly recommended to upgrade your PHP version and/or install the missing extensions whenever possible. This polyfill should be used only when there is no better choice or when portability is a requirement.
Compatibility notes
To write portable code between PHP5 and PHP7, some care must be taken:
\*Errorexceptions must be caught before\Exception;- after calling
error_clear_last(), the result of$e = error_get_last()must be verified usingisset($e['message'][0])instead ofnull !== $e.
Usage
When using Composer to manage your dependencies, you
should not require the symfony/polyfill package, but the standalone ones:
symfony/polyfill-apcufor using theapcu_*functions,symfony/polyfill-ctypefor using the ctype functions,symfony/polyfill-php54for using the PHP 5.4 functions,symfony/polyfill-php55for using the PHP 5.5 functions,symfony/polyfill-php56for using the PHP 5.6 functions,symfony/polyfill-php70for using the PHP 7.0 functions,symfony/polyfill-php71for using the PHP 7.1 functions,symfony/polyfill-php72for using the PHP 7.2 functions,symfony/polyfill-php73for using the PHP 7.3 functions,symfony/polyfill-php74for using the PHP 7.4 functions,symfony/polyfill-php80for using the PHP 8.0 functions,symfony/polyfill-php81for using the PHP 8.1 functions,symfony/polyfill-php82for using the PHP 8.2 functions,symfony/polyfill-php83for using the PHP 8.3 functions,symfony/polyfill-php84for using the PHP 8.4 functions,symfony/polyfill-php85for using the PHP 8.5 functions,symfony/polyfill-iconvfor using the iconv functions,symfony/polyfill-intl-graphemefor using thegrapheme_*functions,symfony/polyfill-intl-idnfor using theidn_to_asciiandidn_to_utf8functions,symfony/polyfill-intl-icufor using the intl functions and classes,symfony/polyfill-intl-messageformatterfor using the intl messageformatter,symfony/polyfill-intl-normalizerfor using the intl normalizer,symfony/polyfill-mbstringfor using the mbstring functions,symfony/polyfill-utilfor using the polyfill utility helpers.symfony/polyfill-uuidfor using theuuid_*functions,
Requiring symfony/polyfill directly would prevent Composer from sharing
correctly polyfills in dependency graphs. As such, it would likely install
more code than required.
Design
This package is designed for low overhead and high quality polyfilling.
It adds only a few lightweight require statements to the bootstrap process
to support all polyfills. Implementations are then loaded on-demand when
needed during code execution.
If your project requires a minimum PHP version it is advisable to add polyfills
for lower PHP versions to the replace section of your composer.json.
This removes any overhead from these polyfills as they are no longer part of your project.
The same can be done for polyfills for extensions that you require.
If your project requires php 7.0, and needs the mb extension, the replace section would look something like this:
{
"replace": {
"symfony/polyfill-php54": "*",
"symfony/polyfill-php55": "*",
"symfony/polyfill-php56": "*",
"symfony/polyfill-php70": "*",
"symfony/polyfill-mbstring": "*"
}
}
Polyfills are unit-tested alongside their native implementation so that feature and behavior parity can be proven and enforced in the long run.
License
This library is released under the MIT license.
Top Related Projects
The Symfony PHP framework
PHP 5.x support for random_bytes() and random_int()
Compatibility with the password_* functions that ship with PHP 5.5
All PHP functions, rewritten to throw exceptions instead of returning false
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot