PlainParser::class, self::BBCODE => BBCodeParser::class, self::MARKDOWN => MarkdownParser::class, ]; public const NAMES = [ self::PLAIN => 'Plain text', self::BBCODE => 'BB Code', self::MARKDOWN => 'Markdown', ]; private static $instances = []; public static function isValid(int $parser): bool { return array_key_exists($parser, self::PARSERS); } public static function name(int $parser): string { return self::isValid($parser) ? self::NAMES[$parser] : ''; } public static function instance(int $parser): ParserInterface { if(!self::isValid($parser)) throw new InvalidArgumentException('Invalid parser.'); if(!isset(self::$instances[$parser])) { $className = self::PARSERS[$parser]; self::$instances[$parser] = new $className; } return self::$instances[$parser]; } }