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.