PHP RFC: Stringable Enums
- Version: 0.1
- Date: 2025-11-07
- Author: Daniel Scherzer, daniel.e.scherzer@gmail.com
- Status: Draft (Later in the RFC process “Under Discussion”, “Voting”, and finally “Accepted”, “Declined” or “Implemented”)
- Implementation: https://github.com/php/php-src/pull/20415
Introduction
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 __toString(), which does not need to involve state. This RFC proposes allowing the __toString() magic method on enums.
<?php enum Foo: string { case Bar = "Baz"; public function __toString() { return __CLASS__ . '::' . $this->name . ' = ' . $this->value; } } echo Foo::Bar; // produces "Foo::Bar = Baz" ?>
Proposal
The error when trying to implement __toString() on an enumeration is removed. The default validation of that magic method (visibility, arguments, return type) is applied if the method is present, and if present the Stringable interface is added as normal (stringable).
Examples
Simple example for a unit enum:
<?php enum Foo { case Bar; public function __toString() { return $this->name . ' is a case of the ' . __CLASS__ . ' enum'; } } echo Foo::Bar; // produces "Bar is a case of the Foo enum" ?>
Simple example for a backed enum:
<?php enum Foo: string { case Bar = "Baz"; public function __toString() { return __CLASS__ . '::' . $this->name . ' = ' . $this->value; } } echo Foo::Bar; // produces "Foo::Bar = Baz" ?>
Backward Incompatible Changes
There should be no backward incompatible changes - this is the removal of an existing error.
Proposed PHP Version(s)
Next PHP version (PHP 8.6).
RFC Impact
To the Ecosystem
Analysis tools that warn about trying to define a __toString() method on enums would need to be updated to not warn when the code is for PHP 8.6+.
To Existing Extensions
There are some built-in enums, e.g. \Random\IntervalBoundary - in the future, they may have __toString() methods, but this RFC does not include such additions.
Future Scope
Perhaps some of the other magic methods should also be allowed.
Voting Choices
Please consult the php/policies repository for the current voting guidelines.
Patches and Tests
Implementation
After the RFC is implemented, this section should contain:
- the version(s) it was merged into
- a link to the git commit(s)
- a link to the PHP manual entry for the feature
References
Links to external references, discussions, or RFCs.
Rejected Features
Keep this updated with features that were discussed on the mail lists.
Changelog
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.