Mysql
 sql >> Base de données >  >> RDS >> Mysql

L'extension des classes est-elle une bonne pratique ?

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.