Io ho 1 classe Database che ha metodi a basso livello per la gestione delle query, il fetch dei record, la gestione degli errori.

Nell'applicazione la classe Database viene istanziata un'unica volta, a livello di bootstrap dell'applicazione. Praticamente ho una classe Init statica che istanzia la classe Database, in qualsiasi punto dell'applicazione recupero l'instanza del database mediante un metodo statico. Questo mi evita di dover passare l'istanza del database come parametro.

Poi ho N classi che sono il model (es: User) che implementano i metodi CRUD. Ogni metodo come prima istruzione fa un Init::GetDB() e quindi recupera l'istanza statica del Database