Comment réutiliser efficacement le code PHP - Introduction aux traits PHP

Comment réutiliser efficacement le code PHP - Introduction aux traits PHP

Développé à l'origine par Rasmus Lerdorf En 1994, PHP est l'un des langages de programmation à usage général les plus utilisés. Né à l'origine comme langue de modèle, au cours des années, il est devenu un langage entièrement entièrement Pavillon (Programmation orientée objet) Support. Sa dernière incarnation, 7.X, introduit de nouvelles fonctionnalités comme Déclaration de type de retour pour les fonctions et les énormes améliorations des performances. PHP est un héritage unique Langue: cela signifie qu'une classe ne peut hériter que pour un parent ou une classe de base. Pour surmonter ce problème, une fonctionnalité a été introduite dans la langue: caractéristiques. Dans cet article, nous verrons comment l'utiliser et comment cela fonctionne.

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser les traits en php


Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant du SO
Logiciel Php
Autre Connaissance de PHP et concepts de programmation orientée objet de base
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Présentation des traits

PHP est un langage d'héritage unique: une classe d'enfants ne peut hériter que d'un seul parent seul . Cela pourrait poser un problème en termes de réutilisation du code, si la classe doit hériter de plusieurs comportements: caractéristiques sont un moyen de résoudre ce problème. Voyons comment. La façon dont nous créons un trait est très similaire à la façon dont nous créons une classe, mais l'une des grandes différences entre les traits et les classes est qu'un trait ne peut pas être instancié, mais ne peut être utilisé que dans une classe ou à l'intérieur d'un autre trait. Créer un trait c'est facile:

Copie

Le code contenu à l'intérieur de «Traiton» est très trivial: il enregistre simplement un message. Voyons comment nous pouvons l'utiliser à l'intérieur d'une classe:

Class Test Utilisez TraitOne; 
Copie

La clé ici est le utiliser mot-clé, que, lorsqu'il est utilisé à l'intérieur d'une classe, «importe» les fonctionnalités regroupées dans le trait. Il est difficile d'imaginer un cas dans lequel la classe que nous avons créée ci-dessus pourrait être utile, car elle n'a pas de méthodes ou de propriétés. Étant donné que la classe utilise le trait «traitone», nous pouvons cependant accéder à la méthode «journal»:

$ test = nouveau test (); $ test-> log (); "Je suis une méthode de traiton!" 
Copie

C'était assez facile, mais ce qui se passe lorsqu'une classe a déjà une méthode avec le même nom de celle incluse dans le trait qu'il utilise ? Voyons-le. Nous ajoutons une méthode «journal» à l'intérieur de la classe de test:

Class Test Utilisez TraitOne; Fonction publique log () echo "Je suis une méthode de la classe de test!";
Copie

Si nous appelons maintenant la méthode «journal», nous obtenons un résultat différent:

$ test = nouveau test (); $ test-> log (); "Je suis une méthode de la classe de test!"
Copie

Et si la classe de test n'avait pas de méthode de «journal», mais l'a héritée d'une classe de base qu'il étendait? Voyons:

Classe Base public Fonction Log () Echo "Je suis une méthode de la classe de base!"; Class Test étend la base Utiliser TraitOne; $ test = new Test (); $ test-> log ();" Je suis une méthode de traitone!"
Copie

Comme vous pouvez le voir, nous avons eu «Je suis une méthode de traitone!«À la suite de l'appel de la méthode du journal. Cela signifie que le Base La méthode de classe a été remplacée par celle à l'intérieur du trait. La hiérarchie à garder à l'esprit ici est simple. À l'intérieur d'une classe:

  1. Les traits remplacent les méthodes héréditaires;
  2. Les méthodes de classe actuelles remplacent les méthodes de trait;

En utilisant plusieurs traits

À l'intérieur d'une classe, nous pouvons utiliser plusieurs traits: tout ce que nous avons à faire, c'est les inclure après le utiliser mot-clé, séparé par une virgule:

Class Test Utilisez TraitOne, traittwo; 
Copie

L'utilisation de plusieurs traits peut cependant créer des conflits de noms. UN erreur fatale est retourné si les traits ont des méthodes avec le même nom:

trait traitone public function log () echo "je suis une méthode de traiton!"; trait traittwo public function log () echo" Je suis une méthode de traittwo!"; Test de classe Utiliser TraitOne, traittwo; Erreur fatale PHP: le journal de la méthode des traits n'a pas été appliqué, car il y a des collisions avec d'autres méthodes de trait 1
Copie

Que pouvons-nous faire pour résoudre ce type de conflits? Nous pouvons utiliser le au lieu de Opérateur, à l'exclusion de la méthode que nous ne voulons pas utiliser:

Class Test Utilisez TraitOne, traittwo traitOne :: log à la place de traittwo; 
Copie

La syntaxe est très simple: nous avons spécifié que nous voulons utiliser la méthode «journal» à partir du trait de trait, résolvant le conflit. Et si nous voulons faire comme ci-dessus, mais nous voulons toujours conserver les fonctionnalités fournies par la méthode «journal» de traittwo? Nous devons créer un alias pour ça. Nous pouvons le faire avec l'utilisation du comme opérateur. Dans l'exemple suivant, nous alias la méthode «log» comme «traittwo_log»:

Class Test Utilisez TraitOne, traittwo traitOne :: log à la place de traittwo; traittwo :: log as traittwo_log; 
Copie

De cette façon, nous pouvons toujours accéder à la méthode «journal» de traittwo, l'invoquant comme traittwo_log ():

$ test = nouveau test (); $ test-> log (); Je suis une méthode de traiton! $ test-> traittwo_log (); Je suis une méthode de traittwo!
Copie

Utiliser l'opérateur AS pour modifier la visibilité d'une méthode de trait

À l'intérieur d'une classe, le comme L'opérateur peut également être utilisé pour modifier la visibilité d'une méthode importée dans le cadre d'un trait. Dans l'exemple précédent, toutes les méthodes des traits sont public. Nous pouvons changer cela à l'intérieur de la classe:

class test Utiliser TraitOne log comme protégé; 
Copie

Avec la syntaxe ci-dessus, nous avons spécifié que la méthode de journal de «Traitone» doit être utilisée comme protégé même s'il était initialement déclaré avec un public visibilité. En effet, si nous essayons d'invoquer la méthode du journal, nous recevons une erreur:

$ test = nouveau test (); $ test-> log (); AVERTISSEMENT PHP: Erreur non revêtue: APPEL TO PROTÉRÉ MÉTHODE TEST :: Log () à partir du contexte "Dans PHP Shell Code: 1 
Copie

Si nous fournissons un nom pour l'alias, le changement de visibilité sera appliqué à la méthode aliasée, tandis que l'original maintiendra sa visibilité:

classe test utiliser traitOne log comme protégé aliased_log;  $ test = nouveau test (); $ test-> log (); Je suis une méthode de traiton! $ test-> aliased_log (); AVERTISSEMENT PHP: Erreur non revêtue: APPEL TO PROTÉRÉ MÉTHODE TEST :: aliased_log () du contexte "dans PHP Shell Code: 1
Copie

Méthodes abstraites et statiques à l'intérieur d'un trait

À l'intérieur d'un trait, nous pouvons définir les deux abstrait et statique méthodes. Dans le premier cas, le trait nécessitera la classe qui l'utilise pour fournir une implémentation concrète de la méthode. Une erreur fatale sera générée si la classe n'implémente pas la méthode ou qu'elle n'est pas déclarée abstraite:

Copie

Une méthode de trait peut également être déclarée et utilisée comme statique:

Copie

Propriétés de traits

Non seulement les méthodes, mais aussi les propriétés peuvent être définies à l'intérieur des traits, la seule règle à respecter est que si une propriété est définie à l'intérieur d'un trait, la classe qui en fait ne peut pas définir une propriété avec le même nom, sauf si elle a le Même visibilité et valeur initiale. Voici un exemple:

Copie

Le $ nom la propriété est définie en «traitone» et également dans la classe «test». Les deux ont la même visibilité (protégée), mais leur valeur initiale est différente, donc ils sont considérés comme incompatibles, ce qui se traduit par une erreur fatale.

Réflexions de clôture

Dans cet article, nous avons appris à savoir caractéristiques, une fonctionnalité qui améliore la réutilisation du code en php. Nous avons vu comment les traits ne peuvent pas être instanciés mais seulement utilisés à l'intérieur des classes, via le utiliser mot-clé. Nous avons vu quel est l'ordre de priorité qui est utilisé lorsqu'un trait et la classe il est utilisé dans les méthodes d'implémentation avec le même nom, comment résoudre ces conflits en utilisant le au lieu de opérateur, et comment créer des alias pour les méthodes de trait et comment il est possible de changer leur visibilité avec le comme opérateur.

Enfin, nous avons vu comment il est également possible de définir des propriétés et des méthodes statiques ou abstraites à l'intérieur d'un trait. Veux en savoir plus sur PHP? Nous avons de nombreux articles sur le sujet!

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Comment créer une application Tkinter à l'aide d'un objet orienté…
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Comment travailler avec l'API WooCommerce REST avec Python
  • Comment comparer les performances du disque sur Linux
  • Comment créer une pile de lampe basée sur Docker à l'aide de Docker sur…
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Choses à installer sur Ubuntu 22.04
  • Comment écrire des extensions de nautilus avec nautilus-python
  • Comment propager un signal aux processus d'enfants à partir d'un bash…