PHP 8.1: New PHPCompatibility.Interfaces.RemovedSerializable sniff by jrfnl · Pull Request #1330 · PHPCompatibility/PHPCompatibility

This was referenced

Mar 9, 2022

@jrfnl jrfnl marked this pull request as draft

March 9, 2022 02:21

@jrfnl

New sniff which addresses the following deprecation in PHP 8.1:

> **Implementing Serializable without `__serialize()` and `__unserialize()`**
>
> Either only the new methods should be implemented, if no support for PHP prior to version 7.4 is provided, or both should be implemented.

This sniff will throw a warning when a class implements the `Serializable` interface, but does not implement the magic `__serialize()` and `__unserialize()` methods.

The sniff contains a `public` `$serializableInterfaces` property for users to provide their own list of additional interfaces (which extend the `Serializable` interface) to scan for.

If the sniff comes across an interface declaration extending the `Serializable` interface and the interface is not in the user provided `$serializableInterfaces` list, a warning will be thrown for the user to add the interface to the property via a custom ruleset.

Additionally, when the `testVersion` has a minimum PHP version of `7.4` or higher, an additional check is executed:
* For interfaces directly extending `Serializable` AND containing a declaration of both the `__serialize()` as well as the `__unserialize()` magic method, thus enforcing the implementation of these methods in classes implementing the interface, a warning will be thrown that the extension of the `Serializable` interface can be removed.
* For classes which implement the `Serializable` interface AND contain a declaration of both the `__serialize()` as well as the `__unserialize()` magic method, a warning will be thrown that the implementation of the `Serializable` interface can be removed.

Includes unit tests.
Includes updating the section about available custom properties in the README.

Refs:
 * https://www.php.net/manual/en/migration81.deprecated.php#migration81.deprecated.core.serialize-interface
 * https://wiki.php.net/rfc/phase_out_serializable
 * https://www.php.net/manual/en/class.serializable.php
 * https://www.php.net/manual/en/language.oop5.magic.php#object.serialize
 * php/php-src#6494
 * php/php-src@3e6b447

@jrfnl jrfnl marked this pull request as ready for review

March 9, 2022 04:56

wimg

wimg approved these changes Mar 19, 2022

@wimg wimg deleted the php-8.1/new-removed-serializable-sniff branch

March 19, 2022 22:34