DEV Community

Cover image for Fixing PHP_CodeSniffer Null Trim() Errors in WordPress Coding Standards
Sarah Siqueira
Sarah Siqueira

Posted on

Fixing PHP_CodeSniffer Null Trim() Errors in WordPress Coding Standards

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.

Understanding PHP_CodeSniffer and WPCS

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.

Fixing

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' ) );
Enter fullscreen mode Exit fullscreen mode

However, as in lots of decisions in software development, just because you can do this, doesn't mean you should.

Image description

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.

Creating a Patch File

Here is a step-by-step guide on how to create and apply a patch for the issue

Create the Patch File

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' ) );
Enter fullscreen mode Exit fullscreen mode

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().

Modify composer.json to Apply the Patch

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"
            }
        }
    }

Enter fullscreen mode Exit fullscreen mode

This tells Composer to apply the fix-null-trim.patch file to the wp-coding-standards/wpcs package when it installs or updates dependencies.

Install the Composer Patch Plugin

To apply patches via Composer, you need the composer-patches plugin.Run the following command to install:

composer require cweagans/composer-patches

Apply the Patch

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!

Top comments (0)