Comment organisez-vous et gérez-vous vos objets d'aide comme le moteur de base de données, la notification utilisateur, la gestion des erreurs, etc. dans un projet orienté objet basé sur PHP?
Disons que j'ai un gros CMS PHP. Le CMS est organisé en différentes classes. Quelques exemples:
- l'objet de base de données
- gestion des utilisateurs
- une API pour créer / modifier / supprimer des éléments
- un objet de messagerie pour afficher des messages à l'utilisateur final
- un gestionnaire de contexte qui vous amène à la bonne page
- une classe de barre de navigation qui affiche des boutons
- un objet de journalisation
- éventuellement, gestion des erreurs personnalisée
etc.
Je traite de la question éternelle, comment rendre au mieux ces objets accessibles à chaque partie du système qui en a besoin.
ma première approche, il y a de nombreuses années, était d'avoir une $ application globale qui contenait des instances initialisées de ces classes.
global $application;
$application->messageHandler->addMessage("Item successfully inserted");
Je suis ensuite passé au modèle Singleton et à une fonction d'usine:
$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
mais je ne suis pas content non plus. Les tests unitaires et l'encapsulation deviennent de plus en plus importants pour moi, et dans ma compréhension de la logique derrière les globals / singletons détruit l'idée de base de la POO.
Ensuite, il y a bien sûr la possibilité de donner à chaque objet un certain nombre de pointeurs vers les objets d'assistance dont il a besoin, probablement la manière la plus propre, la plus économe en ressources et la plus conviviale pour les tests, mais j'ai des doutes sur la maintenabilité de cela à long terme.
La plupart des frameworks PHP que j'ai examinés utilisent soit le modèle singleton, soit des fonctions qui accèdent aux objets initialisés. Les deux bonnes approches, mais comme je l'ai dit, je ne suis satisfait d'aucune des deux.
Je voudrais élargir mon horizon sur les modèles communs qui existent ici. Je recherche des exemples, des idées supplémentaires et des pointeurs vers des ressources qui discutent de cela dans une perspective à long terme et dans le monde réel .
De plus, je suis intéressé d'entendre parler d' approches spécialisées, de niche ou simplement étranges du problème.
$mh=&factory("messageHandler");
est inutile et ne donne aucun avantage en termes de performances. De plus, ceci est obsolète dans la version 5.3.