Mysql
 sql >> Database >  >> RDS >> Mysql

L'estensione delle lezioni è una buona pratica?

Semplice regola pratica:se una classe extends un altro, allora quella classe è quella classe genitore (solo leggermente modificata o estesa). Puoi passare questa classe figlia invece della classe genitore. Esempio:

class Foo { }

class Bar extends Foo { }

function baz(Foo $foo) { }

baz(new Bar);

Funziona, baz() si aspetta un Foo ma accetta anche un Bar , perché Bar è un Foo .

Ora, è i tuoi Users un Database ? No. I tuoi utenti non sono un database. I tuoi utenti usano una banca dati. Se non del tutto, dovresti usare composizione :

class User {

    protected $database;

    public function __construct(Database $database) {
        $this->database = $database;
    }

}

Una classe dovrebbe essere quali sono le sue responsabilità . La responsabilità di una classe di gestione degli utenti è di gestire i dati degli utenti. Parte di ciò può comportare la conversazione con un database, ma ciò non significa che la classe di gestione degli utenti è una banca dati. Se User extends Database , ciò significa che può fare tutto il Database la classe può fare (e altro). Ciò significa che potresti usare l'User classe ovunque anziché il Database classe, e questo non ha alcun senso. Mantieni le responsabilità separate.

Ora, è ancora discutibile se questa sia la struttura giusta o meno, ma va nella giusta direzione. Ma potresti davvero voler avere un User class, che rappresenta un utente . Quindi hai un UserManager o UserORM o UserStorage o qualsiasi altra cosa, che riguardi il recupero e la memorizzazione di User oggetti in un database. Questa classe a sua volta usa un Database per fare proprio questo. Ciò mantiene le responsabilità chiare e separate. L'User la classe rappresenta i dati dell'utente, il Database la classe interagisce con il database, il UserORM/Manager/whatever nel mezzo negozia tra i due.