Simpel tommelfingerregel:hvis en klasse extends
en anden, så er den klasse er denne forældreklasse (kun lidt ændret eller udvidet). Du kan bestå denne børneklasse i stedet for forældreklassen. Eksempel:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Dette virker, baz()
forventer en Foo
men accepterer også en Bar
, fordi Bar
er en Foo
.
Nu er dine Users
en Database
? Nej. Dine brugere er ikke en database. Dine brugere bruger en database. Hvis overhovedet, bør du bruge sammensætning :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
En klasse skal være hvad dens ansvar er . Ansvaret for en brugerstyringsklasse er at administrere brugerdata. En del af det kan involvere at tale med en database, men det betyder ikke, at brugeradministrationsklassen er en database. Hvis User extends Database
, det betyder, at den kan alt hvad Database
er klasse kan (og mere). Det betyder, at du kan bruge User
klasse overalt i stedet for Database
klasse, og det giver ingen mening. Hold ansvar adskilt.
Nu kan det stadig diskuteres, om det er den rigtige struktur eller ej, men det går i den rigtige retning. Men du vil måske virkelig have en User
klasse, som repræsenterer én bruger . Du har så en UserManager
eller UserORM
eller UserStorage
eller hvad som helst, der handler om at hente og gemme User
objekter i en database. Denne klasse bruger igen en Database
at gøre netop det. Det holder ansvar klart og adskilt. User
klasse repræsenterer brugerdata, Database
klasse interagerer med databasen, UserORM/Manager/whatever
i midten forhandler mellem de to.