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.