Une introduction à la recommandation standard PHP (PSR)
Publié: 2019-12-24Il était une fois, lors d'une conférence, les principaux développeurs d'une sélection de frameworks se sont assis dans la même pièce et ont convenu de certaines normes à utiliser pour tous leurs projets. L'objectif était de rendre les frameworks et les bibliothèques PHP plus faciles à combiner pour les utilisateurs. C'est alors que php-fig : le PHP Framework Interop Group est né. Ce groupe d'individus formidables supervise les recommandations des normes PHP (PSR).
La PHP Standard Recommendation (PSR) est une spécification PHP publiée par le PHP Framework Interoperability Group (PHP-FIG). Il sert à la standardisation des concepts de programmation en PHP. L'objectif est de permettre l'interopérabilité des composants. Le PHP-FIG est formé par plusieurs fondateurs de frameworks PHP.
PSR-0 & PSR-4
Ceux-ci décrivent une spécification pour le chargement automatique des classes à partir des chemins de fichiers. PSR-0 et PSR-4 sont tous deux des normes concernant les espaces de noms, les noms de classe et les chemins de fichiers. Ce PSR décrit également où placer les fichiers qui seront chargés automatiquement conformément à la spécification.
Chargement automatique
Le chargement automatique est une fonctionnalité qui aide les développeurs à inclure automatiquement des classes PHP sans écrire des instructions include/require encombrées partout.
En PHP, la définition de la classe est chargée d'instructions require ou include dans les fichiers qu'elles sont appelées, c'est-à-dire avant de l'utiliser comme indiqué ci-dessous.

L'approche ci-dessus soulève des problèmes comme si nous avions des dizaines de classes externes à utiliser dans un fichier et que nous commencions à écrire des lignes d'instructions require/include juste au début d'un fichier source.
Pour surmonter ce problème, PHP 5 a introduit la fonction magique __autoload() qui est automatiquement appelée lorsque votre code référence une classe ou une interface qui n'a pas encore été chargée.

Voici un exemple d'implémentation de base de __autoload() :

L'inconvénient majeur de la fonction __autoload() est qu'elle ne peut être fournie qu'avec un seul autoloader. PHP 5.1.2 a introduit une autre fonction de chargement automatique (spl_autoload_register) pour faire face à la limitation de __autoload .
L'introduction de spl_autoload_register() a donné aux programmeurs la possibilité de créer une chaîne de chargement automatique, une série de fonctions pouvant être appelées pour essayer de charger une classe ou une interface.
Par example:


Le chargement automatique était une si bonne idée que chaque projet a commencé à l'utiliser. Inévitablement, tout le monde a créé sa propre version de l'autochargeur, faute de normes uniformes. De toute évidence, PHP avait désespérément besoin d'un standard pour le chargeur automatique, c'est ainsi que PSR-0 est né. La dernière norme de chargeur automatique acceptée est PSR-4.
PSR-0 (norme de chargement automatique)
Présentation du PSR-0 :
- Un espace de noms et une classe pleinement qualifiés doivent avoir la structure suivante
\<Nom du fournisseur>\(<espace de noms>\)*<Nom de la classe> - Chaque espace de noms doit avoir un espace de noms de niveau supérieur (« Nom du fournisseur »).
- Chaque espace de noms peut avoir autant de sous-espaces de noms qu'il le souhaite.
- Chaque séparateur d'espace de noms est converti en DIRECTORY_SEPARATOR lors du chargement à partir du système de fichiers.
- Chaque caractère _ du CLASS NAME est converti en DIRECTORY_SEPARATOR. Le caractère _ n'a pas de signification particulière dans l'espace de noms.
- L'espace de noms complet et la classe sont suffixés par .php lors du chargement à partir du système de fichiers.
- Les caractères alphabétiques dans les noms de fournisseurs, les espaces de noms et les noms de classe peuvent être constitués de n'importe quelle combinaison de minuscules et de majuscules.
Exemples:
\Doctrine\Common\IsolatedClassLoader =>
/chemin/vers/projet/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request =>
/chemin/vers/projet/lib/vendor/Symfony/Core/Request.php
PSR-4 (norme de chargement automatique)
Présentation du PSR-4 :
- Le terme « classe » fait référence aux classes, interfaces, traits et autres structures similaires.
- Un nom de classe complet a la forme suivante :
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName> - Le nom de classe pleinement qualifié DOIT avoir un nom d'espace de noms de niveau supérieur, également connu sous le nom d'« espace de noms de fournisseur ».
- Le nom de classe pleinement qualifié PEUT avoir un ou plusieurs noms de sous-espace de noms.
- Le nom de classe pleinement qualifié DOIT avoir un nom de classe de terminaison.
- Les traits de soulignement n'ont aucune signification particulière dans aucune partie du nom de classe complet.
- Les caractères alphabétiques dans le nom de classe complet PEUVENT être n'importe quelle combinaison de minuscules et de majuscules.
- Tous les noms de classe DOIVENT être référencés en respectant la casse.
Exemple de chargement automatique basé sur PSR-4 à l'aide de Composer :
- Considérez la structure de répertoires suivante pour réaliser un chargement automatique basé sur PSR-4 à l'aide de composer.

- Créez un fichier composer.json à l'aide de composer init. Sinon, vous pouvez en créer un manuellement maintenant dans la racine de votre projet.

- Configurez le chargement automatique PSR4 en modifiant le fichier composer.json comme indiqué ci-dessous :

- Ici, CodeCourse est un nom de fournisseur de votre application, vous pouvez utiliser ce nom lors de l'espacement des noms de fichiers à l'intérieur de votre répertoire src, tels que :

Ou


etc,
- Et src est le répertoire de votre application que vous souhaitez charger automatiquement.
- Ensuite, ouvrez votre terminal et tapez la commande suivante pour installer les fichiers à chargement automatique dans votre projet. Cela générera le répertoire du fournisseur et le fichier autoload.php à l'intérieur.

- Créons d'abord quelques classes dans le répertoire CodeCourse.
Créez AuthFilters.php dans CodeCourse/Filters

Créez UserRepository.php dans CodeCourse/Repositories

- Enfin, créez un fichier index.php pour le tester et n'exigez qu'une seule fois le fichier autoload.php dans votre fichier index.php.

PSR-1 et PSR-2
PSR-1 et PSR-2 sont utiles pour les normes de codage PHP. PSR-1 se concentre principalement sur la norme de codage de base pour PHP alors que PSR-2 ressemble plus à une version étendue de PSR-1. PSR-1 répertorie un ensemble de règles simples pour les conventions de nommage et PSR-2 fournit un guide de style de codage plus complet.
PSR-1 (norme de codage de base)
Présentation du PSR-1 :
- Seuls <?php ou <?= sont autorisés pour les balises PHP.
- Les noms de classe doivent être définis dans UpperCamelCase.
- Les variables de classe doivent être définies dans camelCase.
- Les constantes de classe doivent être définies dans UPPER_SNAKE_CASE.
- Les noms de méthode doivent être définis dans camelCase.
- Les fichiers DEVRAIENT déclarer des symboles (classes, fonctions, constantes, etc.) ou provoquer des effets secondaires (par exemple générer une sortie, modifier les paramètres .ini, etc.) mais NE DEVRAIENT PAS faire les deux. C'est à dire,

L'exemple ci-dessus provoque un effet secondaire, c'est-à-dire le chargement d'un fichier nommé « file.php ».
- Les fichiers doivent être en UTF-8 sans BOM (Byte Order Mark).
- Les espaces de noms et les noms de classe doivent respecter les normes PSR-0 et PSR-4.
Voici un exemple qui illustre les conventions de dénomination de base pour les propriétés, les classes et les méthodes.

PSR-2 (Guide de style de codage)
Présentation du PSR-2 :
- Vous devez suivre les normes de codage PSR-1.
- 4 espaces doivent être utilisés pour les retraits. L'utilisation des onglets n'est pas autorisée.
- Il n'y a pas de limite à la longueur de ligne, mais elle doit être inférieure à 120 caractères et préférablement inférieure à 80.
- Il doit y avoir une ligne vide après la déclaration d'espace de noms et il doit y avoir une ligne vide après la déclaration de bloc d'utilisation.
- Les accolades ouvrantes pour les classes et les méthodes doivent aller sur la ligne suivante et les accolades fermantes doivent aller sur la ligne après le corps.
- Les méthodes et les propriétés doivent d'abord être définies avec abstract/final, suivi du mot clé public/protected et enfin static.
- Vous ne devez pas mettre de saut de ligne avant les accolades dans les instructions conditionnelles.
- Vous ne devez pas mettre d'espace avant ( et ) dans les instructions conditionnelles.
- Un exemple pour définir des classes :
- Vous devez ouvrir les accolades sur la nouvelle ligne et les mots clés extend et implements doivent être utilisés sur une seule ligne.

S'il y a plusieurs interfaces à implémenter, vous pouvez écrire les noms d'interface dans la nouvelle ligne comme indiqué ci-dessous :

Exemple pour montrer comment les méthodes sont définies en PHP :
Lors de la définition des méthodes, les arguments doivent être écrits sur la même ligne. De plus, vous ne devez pas mettre d'espaces avant les virgules dans les arguments, et vous devez mettre un espace après eux.

S'il y a plusieurs nombres d'arguments, alors ils peuvent être écrits en saut de ligne l'un après l'autre :

Lors de la définition des méthodes, vous devez avoir soit public/protected/private soit abstract/final. Les modes de visibilité viennent après le mot-clé abstract/final, s'il est utilisé. static est le dernier modificateur.

Expressions conditionnelles
- Vous devez mettre un espace avant (
- Vous ne devez pas mettre d'espaces après (
- Vous ne devez pas mettre d'espaces avant )
- Vous devez mettre un espace après )
- utilisez elseif plutôt que else if.
Exemple pour montrer la différence entre elseif et else si :
Interprétation de elseif :

Interprétation de else si :

Pour les instructions switch,
- Les accolades doivent être ouvertes sur la même ligne où l'instruction switch est écrite.
- Le corps du boîtier doit être en retrait une fois du boîtier et le boîtier doit être en retrait une fois du commutateur.
- N'utilisez pas de pause lorsque la pause n'est pas nécessaire.
- Vous pouvez également utiliser return au lieu de break.
Exemple:
