動的な名前からphp 8.1列挙型を作成しようとしています。できないようです。したがって、列挙型が与えられた
enum Foo {
case bar;
}
もちろん、次のように動作します:Foo::bar
これは動作しません:
$name = "bar";
Foo::${$name}
宣言されていない静的プロパティ App\Console\Commands\Foo::$bar へのアクセス
ここでさまざまなトリックを試しましたが、役に立ちませんでした。動的な名前から列挙型インスタンスを取得することはできないようです。私のカスタムで簡単な回避策は、静的ファクトリである次のようになります。
/**
* @throws \Exception
*/
public static function fromName(string $name) : self {
foreach(Foo::cases() as $enum){
if($enum->name === $name){
return $enum;
}
}
throw new \Exception("Not a valid enum name");
}
これをトレイトに入れて、すべての列挙型でこれを継承できます。はい、問題は解決しました。
私の質問は次のとおりです。ここで何か不足していますか? ネイティブphpメソッドで列挙型をインスタンス化することは本当に不可能ですか? それとも、間違った方向に考えていますか?
php8.1 より前の class-as-enum composer パッケージには、これらの便利なメソッドがありました。 https://github.com/bensampo/laravel-enum を参照し てください