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 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
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\ClassNameTestc'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
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\ClassNameTestLa 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 classeCeci 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
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\ClassNameTestressemblerait à 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\ClassNameTestoù 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
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
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.
PSR-0 est-il déprécié?
Comment fonctionne la mise en œuvre de la mise en œuvre dans PSR-4?
Quels sont les avantages de l'utilisation du PSR-4?
Comment puis-je migrer du PSR-0 vers PSR-4?
Puis-je utiliser PSR-4 dans les anciennes versions PHP?
Quel est l'avenir de la mise en scène en php?
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