2012-10-18 6 views
2

J'ai un dilemme sur la façon d'implémenter des états pour des objets. Disons que nous avons ceci:PHP: implémenter des états avec des objets

class User { 

    private $_active;// 1 or 0 
    private $_deleted;// 1 or 0 
    ... 

} 

Ces propriétés - comme je le vois - implique un état sur l'objet utilisateur. Ce que je voudrais faire est de définir des événements comme afterActivate() ou afterDelete() afin que je puisse enchaîner mes routines. C'est à dire. après l'activation mise à jour de certains compteurs, après la suppression également mettre à jour certains compteurs ...

Donc, je considère deux approches pour le moment - le premier est de créer des classes activables et supprimables (ne pas déranger la dénomination), puis faire L'utilisateur hérite de ces classes via une hiérarchie d'héritage.

class Activable { 

    protected afterActivate(){}; 

} 

class Deletable { 

    protected afterDelete(){}; 
} 

class Activable extends Deletable {} 
class User extends Activable{} 

Il y a deux problèmes que je vois cette approche - première est que la classe activable est maintenant implicite état qui est erroné Supprimable et deuxième problème est - si j'ai plusieurs Etats - 5-6 états de la hiérarchie d'héritage peut devenir assez complexe. (parce que l'utilisateur étendra la classe de modèle qui prolongera quelque chose d'autre etc ...)

La deuxième approche consiste à utiliser des traits dans PHP et à les utiliser pour y parvenir. Je voudrais avoir quelque chose comme

class User{ 
    use Activable, Deletable; 

} 

Quelle approche serait mieux - une approche peut-être 3? Suis-je dans la bonne direction ici?

Thanx.

Répondre

0

Habituellement, vous utiliseriez Marker Interface s pour ce genre de chose.
Je suppose que c'est une sorte d'ORM dont nous parlons? Que je suppose également qu'il existe une sorte d'objet qui gère la persistance de vos entités. Laissez cet objet vérifier que $entity instanceof Deletable et agir sur cela.

+0

Puisque votre réponse est la seule et que Marker Interface est une solution viable, je l'accepterai comme la bonne réponse. – Mathew

Questions connexes