


PHP Master | Enregistrement avec PSR-3 pour améliorer la réutilisabilité
Feb 24, 2025 am 10:42 AM
Points de base
- PSR-3, une interface d'objet logarithmique commune, permet aux développeurs d'écrire du code réutilisable sans s'appuyer sur une implémentation de journal spécifique, améliorant ainsi la compatibilité entre les différentes bibliothèques de journaux dans PHP. L'interface
- PSR-3 fournit huit méthodes pour gérer les messages de différents niveaux de gravité et une méthode
log()
courante qui peut recevoir tous les niveaux de gravité. Sa conception est de résoudre le problème de l'incompatibilité de l'implémentation des logarithmes. - Bien que le PSR-3 présente de nombreux avantages, certaines bibliothèques de journaux ne le soutiennent pas en nativement. Cependant, les développeurs peuvent créer des adaptateurs conformes PSR-3 en tirant parti du mode adaptateur et en étendant la classe
AbstractLogger
fournie dans la bibliothèque PSR / log. - De nombreux projets PHP majeurs, notamment Monolog, Symfony et Mustache.php, ont ajouté le support pour PSR-3. Comme il réduit les barrières à la réutilisation du code, davantage de bibliothèques et de cadres devraient utiliser correctement la journalisation, fournissant des informations utiles aux développeurs.
Dans le développement de PHP, la journalisation est l'une des taches les plus courantes. Nous utilisons des journaux pour suivre les messages d'erreur, enregistrer des événements importants et déboguer les problèmes de code. Dans n'importe quel projet PHP, le code peut être rempli d'appels aux bibliothèques de journaux qui gèrent ces opérations pour nous. Malheureusement, les appels aux bibliothèques de journaux sont dispersés dans tout le code, ce qui rend le code dépend de la disponibilité de la bibliothèque, ce qui est clairement contraire au principe de l'inversion de dépendance. Même si nous utilisons l'injection de dépendance pour permettre à nos objets d'accéder à la bibliothèque de journaux, la différence entre les bibliothèques de journaux signifie que les commutations entre eux peuvent être difficiles et longs, nécessitant une refactorisation majeure de la bibliothèque de code entière. Pour améliorer la compatibilité entre les bibliothèques de journaux, l'équipe PHP-Fig a récemment publié PSR-3, une interface d'objet logarithmique commune. Dans cet article, je vais discuter de la fa?on dont l'interface de journal définie par PSR-3 nous permet d'écrire du code réutilisable qui ne dépend d'une implémentation de journal particulière.
PSR-3 Démarrage rapide
Avant de comprendre comment PSR-3 rend notre code plus réutilisable, il est nécessaire de comprendre ce qu'est le PSR-3. Si vous connaissez déjà PSR-3, vous pouvez ignorer cette section. Le noyau de la spécification est l'interface pour log les objets. Cette interface révèle huit fa?ons de gérer les messages de différents niveaux de gravité et une méthode courante log()
qui peut accepter les niveaux de gravité. Les huit niveaux de gravité soutenus par PSR-3 sont basés sur RFC 5424, comme décrit ci-dessous:
-
emergency
- Le système ne peut pas être utilisé -
alert
- L'action est requise -
critical
- situation grave -
error
- Erreurs qui n'ont pas besoin d'attention immédiate mais doivent être surveillées -
warning
- un événement inhabituel ou indésirable, mais pas une erreur -
notice
- événements normaux mais importants -
info
- événements intéressants -
debug
- Détails pour le débogage
Chaque méthode de journal accepte un message qui doit être une cha?ne ou un objet avec une méthode __toString()
. Les paramètres supplémentaires acceptent un tableau qui peut fournir des informations de contexte pour les messages de journal. Une description complète de ces méthodes et paramètres peut être trouvée dans la spécification PSR-3.
Obtenez un fichier psr-3
Obtenir les fichiers dont vous avez besoin pour utiliser PSR-3 est facile - vous pouvez les trouver dans le référentiel PSR / Log GitHub. Vous pouvez également utiliser Composer pour obtenir ces fichiers de Packagist. Voici un exemple de fichier A composer.json
pour récupérer les fichiers PSR / journaux:
{ "require": { "psr/log": "dev-master" } }
Comment limiter la réutilisation du code de la journalisation
PHP a de nombreuses bibliothèques de journaux différentes, chacune avec sa propre fa?on de collecter et d'enregistrer des données. Bien qu'ils aient des points communs, chaque bibliothèque a son propre ensemble unique de méthodes de journalisation. Cela signifie que la commutation entre les journaux peut être difficile et nécessite souvent de modifier le code où vous utilisez la journalisation. Cela fonctionne à contraire au principe solide de la réutilisation du code et de la conception orientée objet. La situation à laquelle nous sommes confrontés est que déclarer les dépendances sur des bibliothèques de journaux spécifiques ou éviter complètement la journalisation. Pour illustrer ce problème plus clairement, un exemple spécifique est nécessaire. Supposons que nous créons un simple objet Mailer pour gérer l'envoi d'e-mails. Nous voulons que Mailer enregistre un message chaque fois que nous envoyons un e-mail, et nous avons décidé d'utiliser l'excellente bibliothèque Monologue pour répondre à nos besoins de journalisation.
<?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 發(fā)送電子郵件的代碼... // 記錄消息 $this->logger->addInfo("Email sent to $emailAddress"); } }
Nous pouvons utiliser cette classe avec le code suivant:
<?php // 創(chuàng)建一個Monolog對象 $logger = new Monolog\Logger("Mail"); $logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log")); // 創(chuàng)建郵件發(fā)送器并發(fā)送電子郵件 $mailer = new Email\Mailer($logger); $mailer->sendEmail("email@example.com");
L'exécution de ce code créera une nouvelle entrée dans le fichier mail.log
, enregistrant l'e-mail envoyé. à ce stade, nous pourrions penser que nous avons écrit un objet Mailer réutilisable. Nous utilisons l'injection de dépendance pour rendre l'enregistreur disponible pour Mailer, afin que nous puissions échanger différentes configurations d'enregistrement sans toucher à notre code Mailer. Il semble que nous ayons réussi le principe solide et évité de créer des dépendances dures. Mais supposons que nous voulons réutiliser la classe Mailer dans différents projets en utilisant Analog pour gérer les interactions de journalisation. Maintenant, nous avons un problème car Analog n'a pas de méthode addInfo()
. Pour enregistrer les messages au niveau de l'information à l'aide de Analog, nous appelons Analog::log($message, Analog::INFO)
. Nous pouvons modifier la classe Mailer pour utiliser la méthode analogique comme indiqué ci-dessous.
<?php namespace Email; class Mailer { public function sendEmail($emailAddress) { // 發(fā)送電子郵件的代碼... // 記錄消息 Analog::log("Email sent to $emailAddress", Analog::INFO); } }
Nous pouvons utiliser la classe Mailer mise à jour avec le code suivant:
{ "require": { "psr/log": "dev-master" } }
Bien que cela fonctionnera, il est loin d'être idéal. Nous avons rencontré la dépendance de Mailer à l'égard d'une implémentation de journalisation spécifique, ce qui nécessite de modifier la classe lors de l'introduction d'un nouvel enregistreur. Cela rend la classe moins réutilisable et nous oblige à choisir entre s'appuyer sur la disponibilité d'un enregistreur particulier ou l'abandon de la journalisation dans la classe.
Utilisez PSR-3 pour éviter les dépendances en journaliste
Comme l'explique Alejandro Gervasio dans son excellent article sur le sujet, le principe de l'inversion de dépendance nous dit que nous devons compter sur l'abstraction plut?t que sur des implémentations concrètes. Dans le cas de l'exploitation forestière, notre problème actuel a été l'absence d'une abstraction appropriée sur laquelle on peut s'appuyer. C'est là que le PSR-3 entre en jeu. Le PSR-3 est con?u pour surmonter l'incompatibilité de la mise en ?uvre de la journalisation en fournissant une interface commune pour l'enregistreur (correctement nommé LoggerInterface
). En fournissant une interface qui n'est pas liée à une implémentation spécifique, PSR-3 nous permet d'éviter de compter sur un enregistreur spécifique - nous pouvons plut?t taper une invite LoggerInterface
pour obtenir un enregistreur conforme à PSR-3. J'ai mis à jour la classe Mailer suivante pour le démontrer:
<?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 發(fā)送電子郵件的代碼... // 記錄消息 $this->logger->addInfo("Email sent to $emailAddress"); } }Le constructeur
a été modifié pour accepter l'implémenteur LoggerInterface
, et la méthode sendEmail()
appelle désormais la méthode info()
spécifiée dans PSR-3. Monolog est déjà conforme PSR-3, et Analog fournit un objet wrapper qui implémente LoggerInterface
, nous pouvons donc maintenant utiliser ces deux b?cherons sans modifier la classe Mailer. Voici comment appeler ce cours à l'aide de Monolog:
<?php // 創(chuàng)建一個Monolog對象 $logger = new Monolog\Logger("Mail"); $logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log")); // 創(chuàng)建郵件發(fā)送器并發(fā)送電子郵件 $mailer = new Email\Mailer($logger); $mailer->sendEmail("email@example.com");
et utilisez un analogique:
<?php namespace Email; class Mailer { public function sendEmail($emailAddress) { // 發(fā)送電子郵件的代碼... // 記錄消息 Analog::log("Email sent to $emailAddress", Analog::INFO); } }
Maintenant, nous pouvons utiliser notre objet Mailer avec une bibliothèque sans modifier la classe Mailer ou modifier la fa?on dont nous l'utilisons.
Utilisez le mode adaptateur pour les journalistes qui ne prennent pas en charge PSR-3
Jusqu'à présent, nous avons réussi à découpler l'objet Mailer à partir de toute implémentation de journalisation spécifique via l'implémentateur demandant LoggerInterface
. Mais qu'en est-il des journalistes qui n'ont pas encore été ajoutés pour le support PSR-3? Par exemple, la populaire bibliothèque Klogger n'a pas été mise à jour depuis un certain temps et est actuellement incompatible avec PSR-3. Heureusement, nous pouvons facilement cartographier les méthodes exposées par Klogger à celles définies dans LoggerInterface
en tirant parti du motif de l'adaptateur. Les fichiers pris en charge dans le référentiel PSR / Log nous permettent de créer facilement des classes d'adaptateur en fournissant une classe AbstractLogger
que nous pouvons étendre. Une classe abstraite transmet simplement huit méthodes de journal spécifiques au niveau défini dans LoggerInterface
à une méthode commun log()
. En étendant la classe AbstractLogger
et en définissant notre propre méthode log()
, nous pouvons facilement créer des adaptateurs conformes PSR-3 aux journalistes qui ne prennent pas nativement le PSR-3. Je vais le démontrer ci-dessous en créant un adaptateur simple pour Klogger:
{ "require": { "psr/log": "dev-master" } }La méthode
log()
mappe simplement la méthode LoggerInterface
à la méthode Klogger respective, et le klogger gère l'activité de journalisation réelle. En emballant la classe Klogger de cette fa?on, nous pouvons l'utiliser sans casser le contrat LoggerInterface
. Nous pouvons maintenant utiliser l'adaptateur Klogger avec la classe Mailer:
<?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 發(fā)送電子郵件的代碼... // 記錄消息 $this->logger->addInfo("Email sent to $emailAddress"); } }
Avec la classe d'adaptateur, nous pouvons utiliser Klogger sans modifier la classe Mailer et adhérer toujours à LoggerInterface
. Klogger n'accepte pas le deuxième paramètre des messages de niveau de débogage, il ne se conforme donc pas pleinement au PSR-3 même avec un adaptateur. L'extension de Klogger pour le rendre entièrement compatible avec le PSR-3 serait une tache triviale, mais cela dépasse le cadre de cet article. Cependant, il est s?r de dire que l'utilisation de notre classe d'adaptateur nous rend très près d'être entièrement conformes au PSR-3 et nous permet d'utiliser LoggerInterface
avec la classe Klogger.
Conclusion
Dans cet article, nous avons appris à utiliser PSR-3 pour nous aider à rédiger du code sans enregistrement qui ne dépend pas d'une implémentation de journalisation spécifique. De nombreux projets PHP majeurs ont ajouté un soutien pour PSR-3, notamment Monolog, Symfony et Mustache.php, ainsi que d'autres projets bien connus comme Drupal discutent de la meilleure fa?on de l'intégrer. étant donné que le PSR-3 réduit les obstacles à la réutilisation du code, nous devrions voir davantage de bibliothèques et de frameworks utiliser correctement la journalisation pour fournir des informations utiles aux développeurs. PSR-3 affectera-t-il la fa?on dont vous utilisez la journalisation dans votre application? Veuillez nous faire savoir dans la section des commentaires ci-dessous.
(image de Fotolia)
(La partie FAQ de la journalisation PSR-3 est omise ici en raison des limitations de l'espace. Il peut être ajouté au besoin.)
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)
