"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Bataille des Autoloaders: PSR-0 vs PSR-4

Bataille des Autoloaders: PSR-0 vs PSR-4

Publié le 2025-03-25
Parcourir:172

Bataille des Autoloaders: PSR-0 vs PSR-4

Takeaways clés

  • PSR-0 et PSR-4 sont des normes de mise en œuvre 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 PSR-4 vise à simplifier la structure du dossier et à supprimer les restes de PSR-0.
  • PSR-4, appelé automatiquement axé 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 prend en charge les développeurs utilisant des conventions de dénomination plus anciennes et des 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'inclusion.

psr-0

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

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.

Compositeur

Lorsque le compositeur s'est présenté et a pris le monde de la gestion des packages 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:

fournisseur/ 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
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
c'est au mieux chaotique, parce que:

Les répertoires «SRC» et «Tests» doivent inclure les noms du 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:

fournisseur/ vendor_name / package_name / src / Classname.php # vendor_name \ package_name \ classname tests / ClassNameTest.php # vendor_name \ package_name \ classNameTest
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
La mise à niveau 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 de PSR-4, tout en permettant des packages beaucoup plus propres, serait beaucoup plus compliqué à mettre en œuvre. Nous appelons la mise au point automatique orientée package PSR-4, car il favorise la propreté des packages 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 package), assurez-vous que le combo de package de fournisseur peut mapper à n'importe quel dossier et permettre un infixé de dossiers entre le combo de package du vendeur et le reste du nom de classe entièrement qualifié.

Cela signifie que nous serions en mesure de mettre nos classes n'importe où dans le code de 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 au chargement manuel.

En outre, le projet indique explicitement qu'un autoloader PSR-4 ne doit jamais lancer des exceptions ou augmenter les erreurs simplement parce que plusieurs autoloaders peuvent être enregistrés, et si l'on ne charge pas de chargement, d'autres doivent avoir la possibilité de le faire - lancer une erreur et arrêter le flux rompt cette compatibilité. Si des informations supplémentaires sur la défaillance 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 des classes à partir de la structure suivante:

/ path / to / packages / foo-bar / src / Baz.php # foo \ bar \ baz Qux / Quux.php # foo \ bar \ qux \ quux tests / Baztest.php # foo \ bar \ baztest Qux / QuuxTest.php # foo \ bar \ Qux \ QuuxTest
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
ressemblerait à ceci:

php // instancier le chargeur $ loder = new \ example \ psr4autoloaderclass; // Enregistrer l'autoloader $ loder-> registre (); // Enregistrez les répertoires de base pour le préfixe de l'espace de noms $ loder-> addNamespace ('foo \ bar', '/ path / to / packages / foo-bar / src'); $ loder-> addNamespace ('foo \ bar', '/ path / to / packages / foo-bar / tests');
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
où l'appel new \ foo \ bar \ qux \ quux; tenterait de charger à partir du premier répertoire enregistré, tandis que new \ foo \ bar \ qux \ quuxTest; tenterait de charger à partir de la seconde.

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

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é. PSR-0, en revanche, est chaotique sur le disque dur, mais prend en charge 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.

Dans les deux cas - il n'y a 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 des personnes qui en ont besoin. C'est à nous de rejoindre la discussion et d'améliorer suffisamment la notion pour atteindre cet état formel.

Des 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é, 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 noms peut être mappé à la structure sous-répertoire. 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 mapper des espaces de noms à n'importe quel répertoire, réduisant le besoin de nidification de répertoire profond.

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 le PSR-0? 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.

PSR-0 est-il déprécié?

Oui, 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 en œuvre de la mise en œuvre dans PSR-4?

Dans PSR-4, la mise en œuvre automatique 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 en œuvre automatique, un besoin réduit de restauration en profondeur répertoire et une efficacité améliorée. Il s'agit également de 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?

Migrating du PSR-0 vers PSR-4 implique la modification de 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 les anciennes versions PHP?

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 en scène en php?

L'avenir de la mise en œuvre automatique dans PHP est susceptible de continuer à évoluer, avec de nouvelles normes et pratiques introduites comme le langage et son écosystème évolue. Cependant, dans un avenir prévisible, le PSR-4 est la norme recommandée pour la mise en scène en php.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3