PHPStan
phil/enumsDeux traits ajoutent des méthodes que PHPStan ne peut pas voir à lui seul : AsInvocableEnumTrait fait de
Status::DRAFT() un appel statique, et AsMetadatableEnumTrait fait de Status::DRAFT->label() un accesseur. La
bibliothèque fournit une extension pour chacun, et une règle pour #[RequiredMeta], toutes chargées par
extension.neon :
includes:
- vendor/phil/enums/extension.neon
Avec phpstan/extension-installer, l'entrée extra.phpstan du
composer.json de la bibliothèque l'inclut automatiquement.
Ce que typent les extensions
InvocableEnum\ReflectionExtension: un appel statique nommé d'après un cas d'une enum qui utiliseAsInvocableEnumTraitrenvoie la primitive du cas — sa valeur pour une enum adossée, son nom pour une enum pure.MetadatableEnum\ReflectionExtension: un accesseur nommé d'après une propriété méta d'une enum qui utiliseAsMetadatableEnumTraitexiste, et renvoie le type de valeur de la propriété méta. Les propriétés méta sont lues là où l'exécution les lit : l'attribut#[Meta]de l'enum, puis celui de chaque trait qu'utilise l'enum. Le type de retour est leTValuede la propriété, joint au type de sondefaultValue()seulement lorsqu'un cas de l'enum ne porte pas l'attribut et peut donc se rabattre sur cette valeur.
Ce que signalent les règles
RequiredMeta\RequiredMetaRule: chaque cas d'une enum qui ne porte pas une propriété méta que demandent ses attributs#[RequiredMeta], une erreur par cas et par propriété, avec l'identifiantphilEnums.requiredMeta—Case App\Status::PUBLISHED does not carry #[Phil\Enums\Attribute\Label], which the enum requires.Les erreurs sont signalées sur la déclaration de l'enum.Declaration\EnumDeclarationRule: ce que les attributs d'une enum déclarent à tort, chacun avec son identifiant :Ordinal\StoredOrdinalRule(philEnums.storedOrdinal) :ordinal()appelé sur une enum avecAsOrdinalEnumTraitdansjsonSerialize(),__serialize(),normalize()ouconvertToDatabaseValue()— là où une valeur quitte le processus. Un ordinal change lorsque les cas sont réordonnés ; stockez la valeur. C'est une heuristique : elle connaît ces méthodes par leur nom et ne suit aucun flux de données.
Les extensions et la règle lisent les attributs par réflexion et n'instancient jamais de cas, puisque PHPStan interdit le chargement automatique pendant l'analyse.