Maison > développement back-end > tutoriel php > Bataille des Autoloaders: PSR-0 contre PSR-4

Bataille des Autoloaders: PSR-0 contre PSR-4

Christopher Nolan
Libérer: 2025-02-23 08:45:11
original
200 Les gens l'ont consulté

Battle of the Autoloaders: PSR-0 vs. PSR-4

Bataille des Autoloaders: PSR-0 contre PSR-4

Les plats clés

  • PSR-0 et PSR-4 sont des normes de mise à jour en PHP, avec PSR-0 définissant des chemins basés sur l'espace de noms d'une classe et permettant des soulignements dans les noms de classe, tandis que le PSR-4 vise à simplifier la structure du dossier et à supprimer les restes de PSR- 0.
  • PSR-4, appelée automatiquement axée sur le package, permet des packages plus propres mais est plus compliqué à implémenter. Il garantit également que les autoloaders ne devraient jamais lancer des exceptions ou augmenter les erreurs, en maintenant la compatibilité avec plusieurs autoloaders.
  • PSR-0 et PSR-4 ont leurs avantages et leurs inconvénients: PSR-4 permet des structures de dossiers plus simples mais ne montre pas le chemin exact d'une classe à partir de son nom entièrement qualifié, tandis que le PSR-0 peut être chaotique mais Soutille les développeurs utilisant des conventions de dénomination plus anciennes et aides à la localisation d'une classe à partir de son nom.

Si vous avez dépassé l'étape débutante de votre formation PHP, vous avez entendu parler de PSR-0 - une norme de mise en œuvre de mise en scène qui définit les moyens d'inclure automatiquement les classes PHP dans votre code sans avoir à utiliser des instructions comme l'exigence et l'inclure.

psr-0

PSR-0 examine l'espace de noms d'une classe et discerne son emplacement sur le disque dur à partir de ce peu d'informations. Par exemple, la classe ZendmailMessage conduirait à /path/to/project/lib/vendor/zend/mail/mesage.php.

PSR-0 prend également en charge les soulignements dans les noms de classe comme une alternative, pour faciliter la transition de 5.2 et plus tôt. Zend_mail_message conduirait également à /path/to/project/lib/vendor/zend/mail/mesage.php.

Composer

Lorsque le compositeur s'est présenté et a pris d'assaut le monde de la gestion des paquets PHP, les choses ont changé. En raison de certaines de ses règles, les dossiers ont souvent dupliqués et sont devenus trop profonds lorsque l'on considère les installations de classe PSR-0 via le compositeur. Par exemple, certaines structures de dossiers se sont retrouvées comme ceci:

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Copier après la connexion
Copier après la connexion

C'est au mieux chaotique, car:

Les répertoires «SRC» et «Tests» doivent inclure des noms de répertoire des fournisseurs et des packages. Ceci est un artefact de la conformité PSR-0.

Par conséquent, certains développeurs PHP hautement qualifiés se sont réunis et ont mis en place une suggestion pour une nouvelle norme: PSR-4.

psr-4

PSR-4 vise à compléter et à travailler avec PSR-0 si nécessaire, pas complètement le remplacer. Cela peut, mais il n'est pas nécessaire. L'objectif principal du PSR-4 est d'éliminer les restes de PSR-0 et de pré-5,3 jours et de permettre une structure de dossiers plus concise. Avec PSR-4, l'arbre de dossier ci-dessus ressemblerait à ceci:

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Copier après la connexion
Copier après la connexion

La mise à niveau du PSR-0 n'était pas une option

parce que PSR-0 ne permet pas de chemin d'intercession entre les parties du nom de classe

Ceci est très important - cela signifie que la mise en œuvre du PSR-4, tout en permettant des packages beaucoup plus propres, serait beaucoup plus compliqué à mettre en œuvre. Nous appelons la mise en œuvre de package PSR-4, car elle favorise la propreté des emballages avant la simplicité.

L'approche choisie

Les objectifs suggérés sont les suivants: Gardez la règle PSR-0 selon laquelle tous les packages doivent contenir au moins deux niveaux d'espace de noms (fournisseur et pack des dossiers entre le combo du fournisseur-package et le reste du nom de classe entièrement qualifié.

Cela signifie que nous serions en mesure de mettre nos cours n'importe où dans le code du package où cela a du sens pour nous en tant qu'êtres humains, et de les utiliser en douceur en PHP sans écrire des techniques de chargement alternatives ou recourir à un chargement manuel.

En outre, le projet indique explicitement qu'un autoloader PSR-4 ne devrait jamais lancer des exceptions ni augmenter les erreurs simplement parce que plusieurs autoloaders peuvent être enregistrés, et si l'on ne charge pas de classe, d'autres devraient avoir la possibilité de le faire - lancer Une erreur et l'arrêt du flux brise cette compatibilité. Si des informations supplémentaires sur l'échec sont requises, il faut utiliser un enregistreur compatible PSR-3 ou d'autres moyens arbitraires.

Comme illustré dans l'exemple de fichier, en utilisant l'autoloader PSR-4 pour charger les classes de la structure suivante:

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Copier après la connexion
Copier après la connexion

ressemblerait à ceci:

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Copier après la connexion
Copier après la connexion

où l'appel de nouveau foobarquxquux; tenterait de charger à partir du premier répertoire enregistré, tandis que le nouveau FOOBARQUXQUXTEST; tenterait de se charger de la seconde.

Cet exemple illustre également l'utilisation de plusieurs dossiers par espace de noms unique.

Conclusion

Il n'y a pas de solution miracle en automatique. Chaque approche apporte avec elle-même quelques avantages et inconvénients - PSR-4 permettrait des structures de dossiers plus simples, mais nous empêcherait de connaître le chemin exact d'une classe simplement en regardant le nom entièrement qualifié. Le PSR-0, d'autre part, est chaotique sur le disque dur, mais soutient les développeurs qui sont coincés dans le passé (les utilisateurs de nom de nom de classe) et nous aide à discerner l'emplacement d'une classe simplement en regardant son nom.

Que pensez-vous du PSR-4? Faites-nous savoir dans les commentaires ci-dessous, ou exprimez votre opinion dans l'un des nombreux débats.

Quoi qu'il en soit - il ne fait aucun doute que la mise à jour axée sur le package est là pour rester. S'il n'est pas officiellement accepté comme standard, alors mis en œuvre sur mesure par les personnes qui en ont besoin. C'est à nous de rejoindre la discussion et d'améliorer suffisamment la notion pour atteindre cet état formel.

Les questions fréquemment posées sur PSR-0 et PSR-4 Autoloading

Quelle est la principale différence entre PSR-0 et PSR-4?

La principale différence entre PSR-0 et PSR-4 réside dans la façon dont ils gèrent les espaces de noms et la structure du répertoire. Le PSR-0 nécessite une corrélation directe entre les espaces de noms et la structure du répertoire, ce qui signifie que chaque soulignement dans l'espace de noms correspond à un séparateur de répertoire. D'un autre côté, le PSR-4 permet une approche plus flexible, où une partie de l'espace de noms peut être mappée à n'importe quel répertoire, et le reste de l'espace de nom Le PSR-4 introduit lorsque le PSR-0 était déjà en place?

PSR-4 a été introduit pour surmonter certaines des limites du PSR-0. La corrélation stricte du PSR-0 entre les espaces de noms et la structure du répertoire a conduit à des répertoires profondément imbriqués, ce qui n'était pas toujours pratique ou efficace. PSR-4 fournit une approche plus flexible, permettant aux développeurs de cartographier les espaces de noms à n'importe quel répertoire, réduisant le besoin de nidification de répertoire profond.

Puis-je utiliser PSR-0 et PSR-4 dans le même projet?

Oui, il est possible d'utiliser à la fois PSR-0 et PSR-4 dans le même projet. Cependant, il est important de noter qu'ils ne devraient pas être utilisés pour automatiquement les mêmes classes. L'utilisation des deux normes peut être bénéfique dans les grands projets où un code hérité suit la norme PSR-0, tandis que le code plus récent suit la norme PSR-4.

Comment le PSR-4 améliore-t-il PSR-0?

Le PSR-4 améliore le PSR-0 en fournissant une approche plus flexible de la mise à jour. Il permet aux développeurs de cartographier une partie de l'espace de noms à n'importe quel répertoire, réduisant le besoin de nidification du répertoire profond. Cela facilite la gestion et la navigation de la structure du répertoire du projet.

Le PSR-0 est-il obsolète?

Oui, le PSR-0 a été marqué comme obsolète. Cela signifie que même s'il est toujours fonctionnel, il n'est pas recommandé pour une utilisation dans de nouveaux projets. Le PSR-4 est la norme recommandée pour la mise à jour en php.

Comment fonctionne la mise à jour dans PSR-4?

Dans PSR-4, la mise en scène fonctionne en mappant une partie de l'espace de noms à n'importe quel répertoire . Le reste de l'espace de noms est ensuite mappé à la structure du sous-répertoire. Cela permet une approche plus flexible et efficace de la mise à jour.

quels sont les avantages de l'utilisation du PSR-4?

PSR-4 offre plusieurs avantages, y compris une approche plus flexible de la mise à jour, réduit, réduit Besoin de nidification du répertoire profond et de l'efficacité améliorée. C'est également la norme recommandée pour la mise à jour en PHP, ce qui en fait un bon choix pour les nouveaux projets.

Comment puis-je migrer du PSR-0 vers PSR-4?

Migration du PSR-0 To PSR-4 implique de modifier la façon dont les espaces de noms et les répertoires sont mappés. Dans PSR-4, une partie de l'espace de noms peut être mappée à n'importe quel répertoire, et le reste de l'espace de noms peut être mappé à la structure du sous-répertoire. Cela peut nécessiter la restructuration de la structure du répertoire de votre projet.

Puis-je utiliser PSR-4 dans des versions PHP plus anciennes?

PSR-4 nécessite PHP 5.3 ou ultérieure. Si vous utilisez une ancienne version de PHP, vous devrez mettre à niveau afin d'utiliser PSR-4.

Quel est l'avenir de la mise à jour en php?

L'avenir de la mise en œuvre de la mise en scène dans PHP devrait continuer à évoluer, les nouvelles normes et pratiques étant introduites à mesure que la langue et son écosystème évoluent. Cependant, dans un avenir prévisible, le PSR-4 est la norme recommandée pour la mise en scène en php.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal