Come organizzi e gestisci i tuoi oggetti di supporto come il motore di database, le notifiche agli utenti, la gestione degli errori e così via in un progetto orientato agli oggetti basato su PHP?
Supponiamo che io abbia un CMS PHP di grandi dimensioni. Il CMS è organizzato in varie classi. Alcuni esempi:
- l'oggetto database
- Gestione utenti
- un'API per creare / modificare / eliminare elementi
- un oggetto di messaggistica per visualizzare i messaggi all'utente finale
- un gestore di contesto che ti porta alla pagina giusta
- una classe della barra di navigazione che mostra i pulsanti
- un oggetto di registrazione
- possibilmente, gestione degli errori personalizzata
eccetera.
Ho a che fare con l'eterna domanda, come rendere al meglio questi oggetti accessibili a ogni parte del sistema che ne ha bisogno.
il mio primo apporach, molti anni fa, fu di avere un'applicazione globale $ che conteneva istanze inizializzate di queste classi.
global $application;
$application->messageHandler->addMessage("Item successfully inserted");
Quindi sono passato al pattern Singleton e a una funzione di fabbrica:
$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
ma non sono contento neanche di questo. I test unitari e l'incapsulamento diventano sempre più importanti per me e, nella mia comprensione, la logica dietro le globali / singleton distrugge l'idea di base di OOP.
Poi c'è ovviamente la possibilità di dare a ogni oggetto un numero di puntatori agli oggetti helper di cui ha bisogno, probabilmente il modo più pulito, di risparmio di risorse e di facile verifica, ma ho dubbi sulla manutenibilità di questo a lungo termine.
La maggior parte dei framework PHP che ho esaminato utilizza il pattern singleton o le funzioni che accedono agli oggetti inizializzati. Entrambi gli approcci sono buoni, ma come ho detto non sono soddisfatto di nessuno dei due.
Vorrei ampliare il mio orizzonte su quali modelli comuni esistono qui. Sto cercando esempi, idee aggiuntive e suggerimenti verso risorse che discutano di questo da una prospettiva a lungo termine , nel mondo reale .
Inoltre, mi interessa conoscere approcci specializzati, di nicchia o semplicemente strani al problema.
$mh=&factory("messageHandler");
è inutile e non produce alcun vantaggio in termini di prestazioni. Inoltre, questo è deprecato in 5.3.