


Plus tôt dans cette série, nous avons exploré les modèles de conception de façade et d'adaptateur de cette série. En utilisant Facade, nous pouvons simplifier les grands systèmes et en implémentant des adaptateurs, nous pouvons rester en sécurité lors de l'utilisation d'API et de classes externes. Nous allons maintenant présenter le modèle de conception du décorateur, qui entre également dans la catégorie des modèles structurels.
Lorsque nous voulons simplement donner des responsabilités supplémentaires à la classe de base, nous pouvons utiliser le modèle décorateur. Ce modèle de conception est une excellente alternative aux fonctionnalités de sous-classement, étendant les fonctionnalités et offrant des avantages supplémentaires.
Question
Si vous êtes confus et pensez que nous pouvons également obtenir la même fonctionnalité en sous-classant les fonctionnalités, laissez-moi vous montrer quelques exemples de code qui dissiperont votre confusion et vous feront aimer le modèle de décorateur.
Je vais donner un exemple de classe chargée de générer du contenu d'e-mail. Dans le bloc de code suivant, comme vous pouvez le voir, cette classe génère très bien le contenu de l'e-mail sans aucune modification.
class eMailBody { private $header = 'This is email header'; private $footer = 'This is email Footer'; public $body = ''; public function loadBody() { $this->body .= "This is Main Email body.<br />"; } }
Nous savons que Noël approche, alors supposons que je veuille saluer mes lecteurs dans mon prochain e-mail de newsletter. Je dois donc ajouter un message dans le corps de l'email avec une image qui a l'air bien.
Pour cela, je pourrais éditer directement dans mon cours de messagerie, mais je ne veux vraiment pas faire ça. Je peux donc implémenter l'héritage pour obtenir le même effet. Je crée une sous-classe distincte de la classe principale du corps de l'e-mail :
class christmasEmail extends eMailBody { public function loadBody() { parent::loadBody(); $this->body .= "Added Content for Xmas<br />"; } } $christmasEmail = new christmasEmail(); $christmasEmail->loadBody(); echo $christmasEmail->body;
J'ai donc terminé mon code et après quelques jours, j'ai voulu envoyer un e-mail avec mes vœux pour la nouvelle année. Nous pouvons utiliser la même approche que Noël.
class newYearEmail extends eMailBody { public function loadBody() { parent::loadBody(); $this->body .= "Added Content for New Year<br />"; } } $newYearEmail = new newYearEmail(); $newYearEmail->loadBody(); echo $newYearEmail->body;
Tout s'est bien passé sans aucun problème. Maintenant, disons que j'ai oublié de saluer mes visiteurs à ces deux occasions (Noël et Nouvel An) et que je souhaite envoyer les deux salutations dans un seul e-mail sans modifier aucun code dans la classe de base.
Votre esprit est immédiatement rempli des questions suivantes : le sous-classement et l'héritage seront-ils utiles ici ? Je suis favorable à cela, mais nous devons utiliser du code supplémentaire/inutile pour y parvenir. Nous pouvons utiliser des traits pour réaliser quelque chose de similaire à l’héritage multiple.
Solution
Le problème dont nous avons discuté dans la section précédente peut être résolu en implémentant le modèle décorateur.
Selon Wikipédia :
Le modèle Decorator (également connu sous le nom de Wrapper, une nomenclature alternative partagée avec le modèle Adapter) est un modèle de conception qui permet l'ajout statique ou dynamique de comportement à un seul objet sans affecter le comportement des autres objets. Même classe.
Dans la section précédente, nous avons vu que nous pouvons étendre les fonctionnalités/comportements à l'aide d'une sous-classe, mais lorsqu'il s'agit d'ajouter plusieurs fonctionnalités/comportements, cela devient verbeux et complexe. C’est là que nous devrions utiliser le modèle décorateur.
Interface
interface eMailBody { public function loadBody(); }
Il s'agit d'une interface simple utilisée pour garantir que certaines classes doivent implémenter les méthodes requises.
Principales catégories d'e-mails
class eMail implements eMailBody { public function loadBody() { echo "This is Main Email body.<br />"; } }
C'est la classe principale qui génère le corps par défaut des e-mails, je l'utilise habituellement pour envoyer des e-mails. Cependant, ce dont j'ai besoin, c'est de modifier le contenu du corps en fonction de certaines occasions, mais pas de changer la classe de courrier électronique principale.
Maître Décorateur
abstract class emailBodyDecorator implements eMailBody { protected $emailBody; public function __construct(eMailBody $emailBody) { $this->emailBody = $emailBody; } abstract public function loadBody(); }
Il s'agit de notre classe de décorateur principale, elle contient une référence à notre classe de courrier électronique principale et modifie son comportement si nécessaire. Nous définissons ici une méthode abstraite, loadBody
, que les enfants décorateurs doivent mettre en œuvre pour changer de comportement.
Décorateur Enfant
class christmasEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for Christmas<br />'; $this->emailBody->loadBody(); } } class newYearEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for New Year.<br />'; $this->emailBody->loadBody(); } }
Ici, nous avons créé deux sous-classes du décorateur principal qui effectuent réellement des changements de comportement sur notre classe de messagerie principale.
Emballez le tout ensemble
Nous avons créé tous les éléments requis. Tout ce que nous avons à faire est d'utiliser notre code et d'en profiter.
interface eMailBody { public function loadBody(); } class eMail implements eMailBody { public function loadBody() { echo "This is Main Email body.<br />"; } } abstract class emailBodyDecorator implements eMailBody { protected $emailBody; public function __construct(eMailBody $emailBody) { $this->emailBody = $emailBody; } abstract public function loadBody(); } class christmasEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for Christmas<br />'; $this->emailBody->loadBody(); } } class newYearEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for New Year.<br />'; $this->emailBody->loadBody(); } }
Nous allons maintenant utiliser ce cours de décorateur de différentes manières selon les besoins :
/* * Normal Email */ $email = new eMail(); $email->loadBody(); // Output This is Main Email body. /* * Email with Xmas Greetings */ $email = new eMail(); $email = new christmasEmailBody($email); $email->loadBody(); // Output This is Extra Content for Christmas This is Main Email body. /* * Email with New Year Greetings */ $email = new eMail(); $email = new newYearEmailBody($email); $email->loadBody(); // Output This is Extra Content for New Year. This is Main Email body. /* * Email with Xmas and New Year Greetings */ $email = new eMail(); $email = new christmasEmailBody($email); $email = new newYearEmailBody($email); $email->loadBody(); // Output This is Extra Content for New Year. This is Extra Content for Christmas This is Main Email body.
Nous pouvons voir que nous avons maintenant modifié le corps de l'e-mail sans modifier la classe principale de l'e-mail.
Conclusion
Chaque application que nous avons nécessite régulièrement des modifications et/ou des améliorations. Ainsi, dans ce cas, nous pouvons implémenter le modèle de conception du décorateur qui, à terme, améliorera la qualité du code et rendra notre code plus évolutif.
J'ai fait de mon mieux pour vous expliquer le motif du décorateur, mais si vous avez d'autres commentaires ou questions, n'hésitez pas à les ajouter au flux ci-dessous.
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!

Pour protéger l'application des attaques XSS liées à la session, les mesures suivantes sont nécessaires: 1. Définissez les drapeaux httponly et sécurisés pour protéger les cookies de session. 2. Codes d'exportation pour toutes les entrées utilisateur. 3. Implémentez la politique de sécurité du contenu (CSP) pour limiter les sources de script. Grâce à ces politiques, les attaques XSS liées à la session peuvent être protégées efficacement et les données utilisateur peuvent être assurées.

Les méthodes pour optimiser les performances de la session PHP incluent: 1. Delay Session Start, 2. Utilisez la base de données pour stocker les sessions, 3. Compress Session Data, 4. Gérer le cycle de vie de la session et 5. Implémenter le partage de session. Ces stratégies peuvent améliorer considérablement l'efficacité des applications dans des environnements de concurrence élevés.

Thesesse.gc_maxlifetimesettingInphpdeterminesthelifespanofessiondata, setInSeconds.1) it'sconfiguredInphp.Iniorviaini_set (). 2)

Dans PHP, vous pouvez utiliser la fonction session_name () pour configurer le nom de session. Les étapes spécifiques sont les suivantes: 1. Utilisez la fonction session_name () pour définir le nom de session, tel que session_name ("my_session"). 2. Après la définition du nom de la session, appelez session_start () pour démarrer la session. La configuration des noms de session peut éviter les conflits de données de session entre plusieurs applications et améliorer la sécurité, mais faire attention à l'unicité, à la sécurité, à la longueur et à la définition du calendrier des noms de session.

L'ID de session doit être régénéré régulièrement lors de la connexion, avant les opérations sensibles et toutes les 30 minutes. 1. Régénérez l'ID de session lors de la connexion pour empêcher les attaques fixes de session. 2. Régénérer avant les opérations sensibles pour améliorer la sécurité. 3. La régénération régulière réduit les risques d'utilisation à long terme, mais l'expérience utilisateur doit être pesée.

La définition des paramètres de cookie de session dans PHP peut être réalisée via la fonction Session_Set_COOKIE_PARAMS (). 1) Utilisez cette fonction pour définir des paramètres, tels que le temps d'expiration, le chemin, le nom de domaine, le drapeau de sécurité, etc.; 2) Appelez session_start () pour que les paramètres prennent effet; 3) Ajuster dynamiquement les paramètres en fonction des besoins, tels que l'état de connexion de l'utilisateur; 4) Faites attention à la définition de drapeaux sécurisés et httponly pour améliorer la sécurité.

L'objectif principal de l'utilisation de sessions en PHP est de maintenir l'état de l'utilisateur entre différentes pages. 1) La session est lancée via la fonction session_start (), créant un ID de session unique et le stockant dans le cookie utilisateur. 2) Les données de session sont enregistrées sur le serveur, permettant de passer les données entre différentes demandes, telles que l'état de connexion et le contenu du panier.

Comment partager une session entre les sous-domaines? Implémenté en définissant des cookies de session pour les noms de domaine communs. 1. Définissez le domaine du cookie de session sur .example.com côté serveur. 2. Choisissez la méthode de stockage de session appropriée, telle que la mémoire, la base de données ou le cache distribué. 3. Passez l'ID de session via des cookies, et le serveur récupère et met à jour les données de session en fonction de l'ID.


Outils d'IA chauds

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.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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

Article chaud

Outils chauds

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft

MinGW - GNU minimaliste pour Windows
Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

mPDF
mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

PhpStorm version Mac
Le dernier (2018.2.1) outil de développement intégré PHP professionnel

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !