While working on WordPress projects with PHP 8.x, you may encounter the following error:
Fatal error: Uncaught PHP_CodeSniffer\Exceptions\RuntimeException: trim(): Passing null to parameter #1 ($string) of type string is deprecated in /path/...
This error occurs due to a deprecation warning in PHP 8.x, where passing null to the trim() function is no longer permitted. Specifically, this issue arises within a WordPress Coding Standards (WPCS) sniff, part of the PHP_CodeSniffer setup. As of the date of this writing, even with the latest versions of PHP_CodeSniffer and WordPress Coding Standards, this issue persists.
PHP_CodeSniffer is a tool that helps developers maintain coding standards by checking their PHP code for violations of specified rules. WordPress Coding Standards (WPCS) provide a set of guidelines for writing consistent and clean code in WordPress projects. The error mentioned above typically indicates that a code snippet is not adhering to these standards due to changes in PHP's behavior.
To fix this, we can manually modify the file causing the issue, locate the line where trim() is called and update the code to ensuring that null values are properly handled when calling trim().
For example, in the file vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php, locate line 280 and replace the following line:
// this $cl_prefixes = trim( PHPCSHelper::get_config_data( 'prefixes' ); // to this $cl_prefixes = is_null( PHPCSHelper::get_config_data( 'prefixes' ) ) ? '' : trim( PHPCSHelper::get_config_data( 'prefixes' ) );
However, as in lots of decisions in software development, just because you can do this, doesn't mean you should.
While the previous approach may fix the error, it's important to remember that modifying vendor files is not a sustainable solution. Changes will be lost every time you update your dependencies via Composer.
A better approach, then, is to create a patch file.
Here is a step-by-step guide on how to create and apply a patch for the issue
A more robust solution is to create a patch file. This method allows you to apply your changes automatically every time you install or update your dependencies.
A patch file is a text file that contains the differences between two versions of a file—essentially a "before" and "after" snapshot.
In your project directory, create a folder to hold the patch file:
mkdir -p patches
Inside the patches/ folder, create a new patch file called fix-null-trim.patch. You can do this with your text editor:
touch patches/fix-null-trim.patch
Open fix-null-trim.patch in your text editor and add the following content:
--- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php @@ -280,7 280,7 @@ // Original code with `trim()` // Update this line: - $cl_prefixes = trim( PHPCSHelper::get_config_data( 'prefixes' ) ); $cl_prefixes = is_null( PHPCSHelper::get_config_data( 'prefixes' ) ) ? '' : trim( PHPCSHelper::get_config_data( 'prefixes' ) ); --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/I18nSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/I18nSniff.php @@ -194,7 194,7 @@ // Original code with `trim()` // Update this line: - $cl_text_domain = trim( PHPCSHelper::get_config_data( 'text_domain' ) ); $cl_text_domain = is_null(PHPCSHelper::get_config_data( 'text_domain' )) ? '' : trim( PHPCSHelper::get_config_data( 'text_domain' ) ); --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Sniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Sniff.php @@ -1144,7 1144,7 @@ // Original code with `trim()` // Update this line: - $cl_supported_version = trim( PHPCSHelper::get_config_data( 'minimum_supported_wp_version' ) ); $cl_supported_version = is_null(PHPCSHelper::get_config_data( 'minimum_supported_wp_version' )) ? '' : trim( PHPCSHelper::get_config_data( 'minimum_supported_wp_version' ) );
This patch tells Composer to replace the problematic line in PrefixAllGlobalsSniff.php with a safer version that uses the null coalescing operator (??) to avoid passing null to trim().
Next, you need to instruct Composer to apply this patch automatically whenever you install or update your dependencies.
Open your project's composer.json file. Add the following configuration under the "extra" section. If the "extra" section does not already exist, you will need to create it.
json "extra": { "patches": { "wp-coding-standards/wpcs": { "Fix null trim() issue": "patches/fix-null-trim.patch" } } }
This tells Composer to apply the fix-null-trim.patch file to the wp-coding-standards/wpcs package when it installs or updates dependencies.
To apply patches via Composer, you need the composer-patches plugin.Run the following command to install:
composer require cweagans/composer-patches
Now, you can apply the patch by running the following command:
composer install
During the installation, Composer will apply the patch from the patches/ folder to the PrefixAllGlobalsSniff.php file.
By creating and applying a patch file, you ensure that your fixes persist across Composer updates, adhering to best practices in software development. Regularly monitor updates to PHP_CodeSniffer and WordPress Coding Standards, as these issues may be resolved in future releases. This proactive approach not only enhances code quality but also improves your development workflow in PHP 8.x environments.
I've shared the patch file in this Gist. Feel free to use it as a reference to implement similar fixes in your projects!
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3