Attributs
-
it.rocks fait un large usage des Attributs disponibles dans le langage PHP depuis sa version 8.0. Ils viennent remplacer la notion d’Annotations fréquemment utilisée par les framework PHP, dans ses versions précédentes, dont la notation est inspirée de la syntaxe des annotations en java. Avant d’aborder les additions d’it.rocks aux Attributs, assurez-vous d’être familier avec le concept de base et leur utilisation en PHP, en consultant la documentation officielle.
Attributs enrichis en it.rocks
Dans le but de décrire des fonctionnalités orientées métier, le fonctionnement standard des Attributs PHP a été étendu pour leur permettre de dépasser ces limitations en PHP natif :
Héritabilité
Contrairement aux autres composantes de la programmation objet telles que les constantes de classe, méthodes et propriétés, les attributs associés à ces composantes ne sont pas héritables : pour connaître les attributs de classes parentes, de traits utilisés, d’interfaces instanciées, de méthodes et propriétés surchargées, etc., le programmeur doit en PHP natif aller parcourir lui-même ces parents pour des attributs qu’il souhaite voir hériter par des descendants de classes, méthodes ou propriétés.
Attributs toujours instanciés
it.rocks introduit la notion d’attributs toujours instanciées : ces attributs seront donc toujours disponibles pour les composantes de la POO concernés, même si le développeur ne les a pas déclaré explicitement. Leur valeur dans ces cas particuliers sera sont une valeur fixée par défaut, soit calculée en fonction du contexte.
Utiliser les fonctionnalités d’attributs enrichis
Les fonctionnalités de Reflection enrichies d’it.rocks, utilisées conjointement avec les attributs de classe d’attributs #Always et #Inheritable, permettent au développeur de bénéficier de ces fonctionnalités additionnelles sans s’occuper de leur mécanique interne.
De nombreux attributs it.rocks utilisent ces comportements, il convient donc de les consulter uniquement avec les fonctionnalités de Reflection enrichies. Les appels aux fonctions de Reflection natives PHP ne tiendront pas compte des propriétés particulières des attributs introduites par #Always et #Inheritable.
Lecture des attributs avec l’API de Reflection enrichie
Utilisez ces fonctions pour lire les attributs enrichis :
- Reflection_Class::getAttributes
- Reflection_Method::getAttributes
- Reflection_Property::getAttributesExemple :
use ITRocks\Framework\Reflection\Attribute\Class_\Group; use ITRocks\Framework\Reflection\Reflection_Class; use Your_Vendor\Your_Project\Something_With_Groups_Or_Not; $class = new Reflection_Class(Something_With_Groups_Or_Not::class); foreach ($class->getAttributes(Group::class) as $attribute) { $group = $attribute->newInstance(); echo "- $group->name" . LF; }
Il est possible de récupérer directement les instances des objets attributs avec ces fonctions, ce qui économise l’étape de l’appel à newInstance en PHP natif :
- Reflection_Class::getAttribute
- Reflection_Method::getAttribute
- Reflection_Property::getAttributeExemple :
use ITRocks\Framework\Reflection\Attribute\Class_\Group; use ITRocks\Framework\Reflection\Reflection_Class; use Your_Vendor\Your_Project\Something_With_Groups_Or_Not; $class = new Reflection_Class(Something_With_Groups_Or_Not::class); foreach ($class->getAttribute(Group::class) as $group) { echo "- $group->name" . LF; }
Enfin, l’écriture compacte permet également de récupérer l’instance (ou la liste d’instances pour un attribut répété) pour les attributs qui utilisent le trait Common (conseillé pour vos attributs it.rocks).
Exemple :
use ITRocks\Framework\Reflection\Attribute\Property\Mandatory; use ITRocks\Framework\Reflection\Reflection_Property; use ITRocks\Framework\User; $property = new Reflection_Property(User::class, 'login'); if (Mandatory::of($property)->value) { echo "L'identifiant obligatoire doit obligatoirement être saisi" . LF; }