Règle simple :si une classe extends
une autre, alors cette classe est cette classe parente (seulement légèrement modifiée ou étendue). Vous pouvez passer cette classe enfant au lieu de la classe parent. Exemple :
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Cela fonctionne, baz()
attend un Foo
mais accepte aussi un Bar
, car Bar
est un Foo
.
Maintenant, est vos Users
une Database
? Non. Vos utilisateurs ne sont pas une base de données. Vos utilisateurs utilisent une base de données. Le cas échéant, vous devriez utiliser composition :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Une classe doit être quelles sont ses responsabilités sont . La responsabilité d'une classe de gestion des utilisateurs est de gérer les données des utilisateurs. Une partie de cela peut impliquer de parler à une base de données, mais cela ne signifie pas que la classe de gestion des utilisateurs est une base de données. Si User extends Database
, cela signifie qu'il peut faire tout ce que la Database
la classe peut faire (et plus). Cela signifie que vous pouvez utiliser le User
classe partout au lieu de la Database
classe, et cela n'a aucun sens. Séparez les responsabilités.
Maintenant, on peut encore se demander si c'est la bonne structure ou non, mais cela va dans la bonne direction. Mais vous voudrez peut-être vraiment avoir un User
classe, qui représente un utilisateur . Vous avez alors un UserManager
ou UserORM
ou UserStorage
ou quoi que ce soit, qui concerne la récupération et le stockage de User
objets dans une base de données. Cette classe à son tour utilise une Database
pour faire juste ça. Cela permet de garder les responsabilités claires et séparées. L'User
la classe représente les données de l'utilisateur, la Database
la classe interagit avec la base de données, le UserORM/Manager/whatever
au milieu négocie entre les deux.