Make WordPress Core


Ignore:
Timestamp:
09/13/2022 03:56:28 PM (3 years ago)
Author:
SergeyBiryukov
Message:

Code Modernization: Fix autovivification from false to array in WP_Scripts::localize().

This function was previously already problematic as it does not do proper input validation, and it has already received tweaks related to PHP 8.0 in [50408] / #52534, which also introduced a _doing_it_wrong() notice and added tests.

The short of it is:

  • The function expects to receive an array for the $l10n parameter;
  • ...but silently supported the parameter being passed as a string;
  • ...and would expect PHP to gracefully handle everything else or throw appropriate warnings/errors.

In the previous fix, a _doing_it_wrong() notice was added for any non-array inputs. The function would also cause a PHP native "Cannot use a scalar value as an array" warning (PHP < 8.0) or error (PHP 8.0+) for all scalar values, except false.

PHP 8.1 deprecated autovivification from false to array, so now false starts throwing an "Automatic conversion of false to array is deprecated" notice.

By rights, the function should just throw an exception when a non-array/string input is received, but that would be a backward compatibility break.

So the current change will maintain the previous behavior, but will prevent both the "Cannot use a scalar value as an array" warning/error as well as the "Automatic conversion of false to array" deprecation notice for invalid inputs.

Invalid inputs will still receive a _doing_it_wrong() notice, which is the reason this fix is considered acceptable.

Includes:

  • Adding a test passing an empty array.
  • Adding a test to the data provider for a null input to make sure that the function will not throw a PHP 8.1 "passing null to non-nullable" notice.

This solves the following PHP 8.1 test error:

Tests_Dependencies_Scripts::test_wp_localize_script_data_formats with data set #8 (false, '[""]')
Automatic conversion of false to array is deprecated

/var/www/src/wp-includes/class.wp-scripts.php:514
/var/www/src/wp-includes/functions.wp-scripts.php:221
/var/www/tests/phpunit/tests/dependencies/scripts.php:1447
/var/www/vendor/bin/phpunit:123

Reference: PHP Manual: PHP 8.1 Deprecations: Autovivification from false.

Follow-up to [7970], [18464], [18490], [19217], [50408].

Props jrf, costdev.
See #55656.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class.wp-scripts.php

    r53366 r54142  
    502502                '5.7.0'
    503503            );
     504
     505            if ( false === $l10n ) {
     506                // This should really not be needed, but is necessary for backward compatibility.
     507                $l10n = array( $l10n );
     508            }
    504509        }
    505510
    506511        if ( is_string( $l10n ) ) {
    507512            $l10n = html_entity_decode( $l10n, ENT_QUOTES, 'UTF-8' );
    508         } else {
    509             foreach ( (array) $l10n as $key => $value ) {
     513        } elseif ( is_array( $l10n ) ) {
     514            foreach ( $l10n as $key => $value ) {
    510515                if ( ! is_scalar( $value ) ) {
    511516                    continue;
Note: See TracChangeset for help on using the changeset viewer.