Make WordPress Core

07/30/2021 02:46:30 PM (3 years ago)

Code Modernization: Fix "JsonSerializable_Object::jsonSerialize() should be compatible with JsonSerializable::jsonSerialize(): mixed" error on PHP 8.1.

This relates to the Return types for internal methods RFC in PHP 8.1 and in particular, the change made in PHP PR #7051, which adds a mixed return type to the JsonSerializable::jsonSerialize() interface method.

WordPress only contains one (test) class which implements the JsonSerializable interface and this commit fixes the issue for that class.

As of PHP 8.1, the jsonSerialize() method in classes which implement the JsonSerializable interface are expected to have a return type declared. The return type should be mixed or a more specific type. This complies with the Liskov principle of covariance, which allows the return type of a child overloaded method to be more specific than that of the parent.

The problem with this is that:

  1. The mixed return type was only introduced in PHP 8.0.
  2. Return types in general were only introduced in PHP 7.0.

WordPress still has a minimum PHP version of 5.6, so adding the return type is not feasible for the time being.

The solution chosen for now is to add an attribute to silence the deprecation warning. While attributes are a PHP 8.0+ feature, due to the choice of the #[] syntax, in PHP < 8.0, attributes will just be ignored and treated as comments, so there is no drawback to using the attribute.

Props jrf.
See #53635.

1 edited


Note: See TracChangeset for help on using the changeset viewer.