Enumerations (enums) were introduced in PHP 8.1 (enumerations). The RFC specified that magic methods other than __call(), __callStatic(), and __invoke() would not be permitted in enums, noting that most other magic methods involve state, which enum instances do not have. However, the exclusion also applies to __debugInfo(), which does not need to involve state. This RFC proposes allowing the __debugInfo() magic method on enums.
<?php enum Foo: string { case Bar = "Baz"; public function __debugInfo() { return [ __CLASS__ . '::' . $this->name . ' = ' . $this->value ]; } } var_dump(Foo::Bar); // produces an array with `"Foo::Bar = Baz"` ?>
The error when trying to implement __debugInfo() on an enumeration is removed. The default validation of that magic method (visibility, arguments, return type) is applied if the method is present.
Simple example for a unit enum:
<?php enum Foo { case Bar; public function __debugInfo() { return [$this->name . ' is a case of the ' . __CLASS__ . ' enum']; } } var_dump(Foo::Bar); // produces an array with "Bar is a case of the Foo enum" ?>
Simple example for a backed enum:
<?php enum Foo: string { case Bar = "Baz"; public function __debugInfo() { return [__CLASS__ . '::' . $this->name . ' = ' . $this->value]; } } var_dump(Foo::Bar); // produces an array with `"Foo::Bar = Baz"` ?>
There should be no backward incompatible changes - this is the removal of an existing error.
Next PHP version (PHP 8.6).
Analysis tools that warn about trying to define a __debugInfo() method on enums would need to be updated to not warn when the code is for PHP 8.6+.
There are some built-in enums, e.g. \Random\IntervalBoundary - in the future, they may have __debugInfo() methods, but this RFC does not include such additions.
Perhaps some of the other magic methods should also be allowed.
Please consult the php/policies repository for the current voting guidelines.
https://github.com/php/php-src/pull/21425
After the RFC is implemented, this section should contain:
Links to external references, discussions, or RFCs.
__toString() on enums, rather than __debugInfo(), but feedback on the mailing list (https://news-web.php.net/php.internals/129540) led to a rewrite.If there are major changes to the initial proposal, please include a short summary with a date or a link to the mailing list announcement here, as not everyone has access to the wikis' version history.