Partially deprecate Serializable by nikic · Pull Request #6494 · php/php-src

thg2k

If Serializable is implemented, require that __serialize() and
__unserialize() are implemented as well, else issue a deprecation
warning.

@nikic

@nikic

wouterj added a commit to wouterj/php-src that referenced this pull request

Aug 5, 2021

nikic pushed a commit that referenced this pull request

Aug 11, 2021
The deprecation message was originally introduced in 3e6b447 (#6494).

I first encountered this notice when testing the MongoDB extension
with PHP 8.1, which produced many duplicate messages that provided
no detail about the particular class that needed to be fixed.

Closes GH-7346.

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request

Mar 9, 2022
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 mentioned this pull request

Mar 9, 2022

jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request

Mar 9, 2022
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