Table des matières
Utilisez des classes abstraites lorsque: partager une logique commune avec un héritage contrôlé
Utiliser des traits lorsque: réutiliser le code dans les classes non apparentées
3. Quand choisir lequel?
Réflexions finales
Maison développement back-end tutoriel php Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques.

Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques.

Aug 11, 2025 pm 11:17 PM
php Programmation orientée objet

Utilisez des interfaces pour définir les contrats pour des classes non apparentées, en veillant à la mise en œuvre de méthodes spécifiques; 2. Utilisez des classes abstraites pour partager la logique commune parmi les classes connexes tout en appliquant l'héritage; 3. Utilisez des traits pour réutiliser le code des services publics dans les classes non liées sans héritage, favorisant la conception sèche et flexible. Chaque outil sert un objectif distinct et peut être combiné pour un code robuste orienté objet maintenable.

Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques.

PHP fournit plusieurs façons de réutiliser le code et de définir les contrats dans la programmation orientée objet: traits, classes abstraites et interfaces. Bien qu'ils puissent sembler similaires à première vue, chacun sert un objectif distinct et est adapté à différents scénarios. Comprendre quand utiliser ce qui peut améliorer considérablement la conception et la maintenabilité du code.

Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques.

1. Ce qu'ils sont et comment ils diffèrent

Les interfaces définissent un contrat - ils spécifient quelles méthodes une classe doit mettre en œuvre, mais pas comment .
Les classes abstraites fournissent une implémentation partielle - ils peuvent définir à la fois les signatures de méthode et le code réel, et ne peuvent pas être instanciés directement.
Les traits sont un moyen de réutiliser le code entre les classes non apparentées - elles vous permettent d'injecter des méthodes dans les classes sans utiliser l'héritage.

Fonctionnalité Interface Classe abstraite Trait
Implémentation de la méthode Non (PHP 8.0 permet par défaut par default ) Oui (peut mélanger le résumé et le béton) Oui (toutes les méthodes sont concrettes)
Inclusion multiple Oui (une classe peut implémenter beaucoup) Non (héritage unique seulement) Oui (traits multiples autorisés)
Propriétés Non (avant PHP 8.1) / Oui (de PHP 8.1 avec readonly ) Oui Oui
Instanciation Non Non Non (ne peut pas être instancié)
Héritage Non Oui (les classes peuvent en étendre une) Non (utilisé via use )

2. Cas d'utilisation pratiques

Utilisez des interfaces lorsque: définir des contrats dans les classes non liées

Les interfaces sont idéales lorsque vous souhaitez appliquer que différentes classes soutiennent un comportement commun, quel que soit leur arbre hérité.

Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques.

Exemple: processeurs de paiement

 Interface PaymentGateway {
    Processus de fonction publique (Montant Float $): bool;
    REMONDEMENT DE FONCTION PUBLIQUE (String $ TransactionID): bool;
}

Classe Stripegateway implémente PaymentGateway {
    Processus de fonction publique (Float $ montant): bool {
        // logique spécifique à la bande
        Retour Vrai;
    }
    REMONDEMENT DE FONCTION PUBLIQUE (String $ TransactionID): bool {
        // logique de remboursement de rayures
        Retour Vrai;
    }
}

classe PayPalgateway implémente PaymentGateway {
    Processus de fonction publique (Float $ montant): bool {
        // logique spécifique à PayPal
        Retour Vrai;
    }
    REMONDEMENT DE FONCTION PUBLIQUE (String $ TransactionID): bool {
        // PayPal Rembound Logic
        Retour Vrai;
    }
}

Pourquoi interface?

Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques.
  • Les deux passerelles se comportent différemment mais doivent soutenir les mêmes opérations.
  • Vous pouvez taper PaymentGateway dans les services, ce qui rend votre code flexible et testable.

Utilisez des classes abstraites lorsque: partager une logique commune avec un héritage contrôlé

Les classes abstraites fonctionnent bien lorsque vous avez un ensemble de fonctionnalités de base qui devrait être partagé entre les classes étroitement liées.

Exemple: contrôleurs de système de gestion de contenu (CMS)

 Classe abstraite BaseController {
    Fonction protégé LogAccess (): void {
        Echo "Utilisateur accessible à". Date ('ymd h: i: s'). "\ n";
    }

    Résumé Index de fonction publique ();

    fonction publique notfound () {
        http_response_code (404);
        Echo "Page introuvable.";
    }
}

classe post-contrôleur étend BaseController {
    Index de fonction publique () {
        $ this-> logaccess ();
        echo "Affichage de tous les messages ... \ n";
    }
}

Pourquoi une classe abstraite?

  • Tous les contrôleurs partagent la journalisation et la gestion des erreurs.
  • Chaque contrôleur doit définir son propre comportement index() .
  • Vous évitez de dupliquer la logique commune.

Utiliser des traits lorsque: réutiliser le code dans les classes non apparentées

Les traits résolvent le problème de la duplication de code lorsque plusieurs classes ont besoin des mêmes méthodes d'utilité mais ne partagent pas de parent.

Exemple: comportements horodomagistes et enregistrables

 timestampable de trait {
    fonction publique setCreatEdat (): void {
        $ this-> CreateDat = new DateTime ();
    }

    Fonction publique SetUpDateDat (): void {
        $ this-> updatedat = new DateTime ();
    }
}

trait logingable {
    Journal des fonctions publiques (chaîne $ message): void {
        file_put_contents ('log.txt', $ message. "\ n", file_append);
    }
}

classe utilisateur {
    Utilisez une horodatage, logique;

    String public $ name;
    private? DateTime $ CreateDat = null;
    private? DateTime $ updatedat = null;
}

Classe Product {
    Utilisez une horodatage, logique;

    Titre de chaîne publique;
    private? DateTime $ CreateDat = null;
    private? DateTime $ updatedat = null;
}

Pourquoi trait?

  • User et Product ont besoin d'horodatage et de journalisation, mais ne sont pas liés par le domaine.
  • Évitez de forcer une hiérarchie d'héritage artificielle.
  • Gardez le code sec sans limiter la conception de la classe.

⚠️ CATTE: Les traits peuvent conduire à un code désordonné s'il est surutilisé. Évitez de les utiliser pour la logique commerciale de base - ils sont les meilleurs pour les préoccupations croisées comme la journalisation, la mise en cache ou la répartition des événements.


3. Quand choisir lequel?

  • Utilisez une interface lorsque vous avez besoin de vous assurer qu'une classe prend en charge certaines méthodes (par exemple, JsonSerializable , Iterator ).
  • Utilisez une classe abstraite lorsque vous avez une famille de classes connexes qui partagent à la fois la structure et le comportement.
  • Utilisez un trait lorsque vous souhaitez réutiliser le code dans les classes qui ne partagent pas un parent mais qui ont besoin des mêmes méthodes d'assistance.

Vous pouvez même les combiner :

 interface notifiable {
    Fonction publique SendNotification (String $ msg);
}

trait emailNotifier {
    Fonction publique Sendnotification (String $ msg) {
        mail ($ this-> e-mail, «notification», $ msg);
    }
}

Résumé Classe BaseUser {
    Fonction publique abstraite getName ();
}

CLASSE Le client étend BaseUser implémente notifiable {
    Utilisez EmailNotifier;
    Public String $ Email;

    fonction publique getName () {
        retourner «client»;
    }
}

De cette façon, vous obtenez:

  • Application des contrats via l'interface
  • Réutilisation du code via le trait
  • Logique de base partagée via une classe abstraite

Réflexions finales

Aucun de ces outils ne remplace les autres - ils se complètent.
Les interfaces garantissent la cohérence.
Les classes abstraites favorisent l'héritage avec la logique partagée.
Les traits permettent la réutilisation du code horizontal.

Choisir le bon dépend de vos objectifs de conception:
Est-ce ce que la classe peut faire ? → Interface
S'agit-il d' un comportement partagé dans une hiérarchie ? → classe abstraite
S'agit-il de réutiliser le code des services publics dans les domaines ? → trait

Fondamentalement, utilisez des interfaces pour les API, des classes abstraites pour les comportements de base dans une famille et des traits pour les mélanges.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1543
276
Tigne de performance de cartographie relationnelle d'objet (ORM) dans PHP Tigne de performance de cartographie relationnelle d'objet (ORM) dans PHP Jul 29, 2025 am 05:00 AM

Évitez N 1 Problèmes de requête, réduisez le nombre de requêtes de base de données en chargeant à l'avance des données associées; 2. Sélectionnez uniquement les champs requis pour éviter de charger des entités complètes pour enregistrer la mémoire et la bande passante; 3. Utilisez raisonnablement les stratégies de cache, telles que le cache secondaire de la doctrine ou les résultats de requête à haute fréquence de cache de Doctrine; 4. Optimisez le cycle de vie de l'entité et appelez régulièrement () pour libérer la mémoire pour empêcher le débordement de la mémoire; 5. Assurez-vous que l'indice de base de données existe et analysez les instructions SQL générées pour éviter les requêtes inefficaces; 6. Désactiver le suivi automatique des changements dans les scénarios où les modifications ne sont pas nécessaires et utilisez des tableaux ou des modes légers pour améliorer les performances. L'utilisation correcte de l'ORM nécessite de combiner la surveillance SQL, la mise en cache, le traitement par lots et l'optimisation appropriée pour garantir les performances de l'application tout en maintenant l'efficacité du développement.

VSCODE Settings.json Emplacement VSCODE Settings.json Emplacement Aug 01, 2025 am 06:12 AM

Le fichier SetfitS.JSON est situé dans le chemin de niveau utilisateur ou au niveau de l'espace de travail et est utilisé pour personnaliser les paramètres VScode. 1. Chemin de niveau utilisateur: Windows est C: \ Users \\ AppData \ Roaming \ Code \ User \ Settings.json, macOS est /users//library/applicationsupport/code/user/settings.json, Linux est /home//.config/code/user/settings.json; 2. Chemin au niveau de l'espace de travail: .vscode / Paramètres dans le répertoire racine du projet

Construire des objets immuables en PHP avec des propriétés en lecture Construire des objets immuables en PHP avec des propriétés en lecture Jul 30, 2025 am 05:40 AM

ReadonlypropertiesInphp8.2CanlybeassignedonceinthestrustructoratDeclarationandcannotBemodifiedAfterward, applicationmutabilityaThelanguageLevel.2.Toachievedeep-immutability, webutableTypeSlikEarrayinArrayobjectorUSustomymutability, webutilletypeslikearraysinarrayobjectoruseseCustomMutabeColEctionSucha.

Une plongée profonde dans le mécanisme de collecte interne de PHP Une plongée profonde dans le mécanisme de collecte interne de PHP Jul 28, 2025 am 04:44 AM

Le mécanisme de collecte des ordures de PHP est basé sur le comptage de référence, mais les références circulaires doivent être traitées par un collecteur de déchets circulaires périodique; 1. Le nombre de références libère la mémoire immédiatement lorsqu'il n'y a pas de référence à la variable; 2. Référence La référence fait que la mémoire ne peut pas être automatiquement libérée, et cela dépend de GC pour le détecter et le nettoyer; 3. GC est déclenché lorsque la "racine possible" Zval atteint le seuil ou appelle manuellement gc_collect_cycles (); 4. Les applications PHP à long terme devraient surveiller GC_Status () et appeler GC_COLLECT_CYCLES () à temps pour éviter la fuite de mémoire; 5. Les meilleures pratiques incluent d'éviter les références circulaires, en utilisant gc_disable () pour optimiser les zones clés de performance et les objets de déréférence via la méthode Clear () d'Orm.

Passez l'exemple de l'exemple de journalisation du middleware http Passez l'exemple de l'exemple de journalisation du middleware http Aug 03, 2025 am 11:35 AM

HTTP Log Middleware dans GO peut enregistrer les méthodes de demande, les chemins de requête, la propriété intellectuelle du client et le temps qui prend du temps. 1. Utilisez http.handlerfunc pour envelopper le processeur, 2. Enregistrez l'heure de début et l'heure de fin avant et après l'appel Suivant.Servehttp, 3. Obtenez le vrai client IP via R.RemoteAddr et X-Forwared-For Headers, 4. Utilisez le log.printf aux journaux de demande de sortie, 5. L'exemple de code complet a été vérifié pour s'exécuter et convient au démarrage d'un projet petit et moyen. Les suggestions d'extension incluent la capture des codes d'état, la prise en charge des journaux JSON et le suivi des ID de demande.

La visionneuse PDF Edge ne fonctionne pas La visionneuse PDF Edge ne fonctionne pas Aug 07, 2025 pm 04:36 PM

TestThepdfinanotherApptodetermineIftheissueiswiththefileoredge.2.EnBlEthebuilt-inpdfViewerByTurningOff "AlwaysOpenpdffilesexternal" et "DownloadPdffiles" inedgestoSolver.

Exemple de bascule du mode sombre CSS Exemple de bascule du mode sombre CSS Jul 30, 2025 am 05:28 AM

Tout d'abord, utilisez JavaScript pour obtenir les préférences du système utilisateur et les paramètres de thème stockés localement et initialiser le thème de la page; 1. La structure HTML contient un bouton pour déclencher la commutation du sujet; 2. CSS utilise: Root pour définir des variables de thème brillantes, la classe de mode. Dark définit les variables de thème sombres et applique ces variables via var (); 3. JavaScript détecte préfère-Color-Scheme et lit LocalStorage pour déterminer le thème initial; 4. Communiquez la classe en mode noir sur l'élément HTML lorsque vous cliquez sur le bouton et enregistre l'état actuel vers LocalStorage; 5. Tous les changements de couleur sont accompagnés d'une animation de transition de 0,3 seconde pour améliorer l'utilisateur

Techniques d'optimisation et de profilage des performances Java Techniques d'optimisation et de profilage des performances Java Jul 31, 2025 am 03:58 AM

Utilisez des outils d'analyse des performances pour localiser les goulots d'étranglement, utiliser VisualVM ou JProfiler dans la phase de développement et de test, et donner la priorité à l'async-profil dans l'environnement de production; 2. Réduire la création d'objets, réutiliser les objets, utiliser StringBuilder pour remplacer l'épissage de la chaîne et sélectionner les stratégies GC appropriées; 3. Optimiser l'utilisation de la collection, sélectionner et prérégler la capacité initiale selon la scène; 4. Optimiser la concurrence, utiliser des collections simultanées, réduire la granularité de verrouillage et régler raisonnablement le pool de threads; 5. Assurez les paramètres JVM, définissez la taille du tas raisonnable et le collecteur de déchets à faible latence et activez les journaux GC; 6. Évitez la réflexion au niveau du code, remplacez les classes de wrapper par des types de base, retardez l'initialisation et utilisez final et statique; 7. Test et surveillance des performances continues, combinées avec JMH

See all articles