'PHP Enums `__toString` magic method
I am wondering why it is not possible to provide an __toString implementation for enum.
IDE says "Enum may not include '__toString'". However it was the first thing I thought about once I created enum. Previously I used Value Objects encapsulating strings in my code, which utilized string casting when necessary. Now I would like to migrate 'em into enums, but those resist.
#[Immutable]
enum SaveKlinesFromApiQueue: string
{
case DEFAULT = 'save_klines_from_api_queue';
case PRIORITY = 'save_klines_from_api_priority_queue';
public function __toString(): string
{
return $this->value;
}
}
Solution 1:[1]
As chris mentions, magic methods are not allowed.
For the 2 most(?) common usecases:
To get the string value of a single one, you can just use ->value.
If you want the string values of all of them, just add a loop in a method:
public static function strings(): array
{
$strings = [];
foreach(self::cases() as $case) {
$strings[] = $case->value;
}
return $strings;
}
Solution 2:[2]
Implementing JsonSerializable works if your use-case involves converting an enum property to json.
enum ParameterTypeEnum implements \JsonSerializable
{
case QUERY;
case COOKIE;
case HEADER;
case PATH;
public function getType(): string
{
return match($this) {
ParameterTypeEnum::QUERY => 'query',
ParameterTypeEnum::COOKIE => 'cookie',
ParameterTypeEnum::HEADER => 'header',
ParameterTypeEnum::PATH => 'path',
};
}
public function jsonSerialize(): mixed
{
return $this->getType();
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Puggan Se |
| Solution 2 | cnizzardini |
