Eenvoudige vuistregel:als een klasse extends
een andere, dan is die klasse is die ouderklasse (slechts licht gewijzigd of uitgebreid). U kunt deze kindklasse doorgeven in plaats van de bovenliggende klasse. Voorbeeld:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Dit werkt, baz()
verwacht een Foo
maar accepteert ook een Bar
, omdat Bar
is een Foo
.
Nu, is uw Users
een Database
? Nee. Uw gebruikers zijn geen database. Uw gebruikers gebruiken een databank. Als u dat al doet, moet u compositie . gebruiken :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Een klas moet zijn wat zijn verantwoordelijkheden zijn . De verantwoordelijkheid van een gebruikersbeheerklasse is het beheren van gebruikersgegevens. Een deel daarvan kan het praten met een database inhouden, maar dat betekent niet dat de gebruikersbeheerklasse is een databank. Als User extends Database
, dat betekent dat het alles kan doen wat de Database
klas kan doen (en meer). Dat betekent dat u de User
. kunt gebruiken klasse overal in plaats van de Database
klasse, en dat slaat nergens op. Houd verantwoordelijkheden gescheiden.
Nu is het nog de vraag of dat de juiste structuur is of niet, maar het gaat de goede kant op. Maar misschien wilt u echt een User
class, wat staat voor één gebruiker . Je hebt dan een UserManager
of UserORM
of UserStorage
of wat dan ook, dat te maken heeft met het ophalen en opslaan van User
objecten in een database. Deze klasse gebruikt op zijn beurt een Database
om dat te doen. Dat houdt verantwoordelijkheden helder en gescheiden. De User
klasse staat voor gebruikersgegevens, de Database
class interageert met de database, de UserORM/Manager/whatever
in het midden onderhandelt tussen de twee.