J'ai un objet PHP5 transmettre des messages à un autre et souhaite attacher un type à chaque message. Par exemple, Strings ( définit le travail: p> mais polluer l'espace de noms global et nécessiterait donc plus de noms verbeux à assurer l'unicité. Je préférerais ne pas avoir mon code jonché de choses comme Enfin, je pourrais utiliser des noms de classe pour distinguer les types, comme: P> msg_hot code>,
msg_warm code> et
msg_cold code>. Si PHP5 avait un type d'énum, j'utiliserais probablement cela pour définir les types de message, mais (à moins que je ne me trompe), il n'y a pas de tel animal. J'ai examiné quelques options:
'msg_hot' code>,
'msg_warm' code> et
'msg_cold' code>) sont mauvaises parce que je tiens inévitablement quelque chose comme
'msg_wram' code> et les choses vont casser. Les chiffres subissent le même problème et sont également moins clairs. P>
applicationName_Messages_type_hot code>. P>
class MessageHot extends Message {}
class MessageWarm extends Message {}
class MessageCold extends Message {}
class Message
{
public function Type()
{
return get_class($this);
}
public function Data()
{
return $this->data;
}
public function __construct($data)
{
$this->data = $data;
}
private $data;
}
4 Réponses :
Vous pouvez utiliser Constantes de classe :
class Message { const hot = 0; const warm = 1; const cold = 2; } foo(Message::hot); foo(Message::warm); foo(Message::cold);
Heh, je jure que cela n'était pas sur la page quand j'ai répondu. Greg, la plupart des normes de codage PHP (poire, zend, etc.) nécessitent l'utilisation de toutes les capuchons pour des noms constants. Cela aide certainement à la reconnaissance du code.
Une convention comme celle-ci est très importante lorsque vous créez vos constantes de définir (bien que je trouve tous-caps fesses-laids, donc je préfère un préfixe «K», comme dans KCONSANTName), mais ce n'est vraiment pas nécessaire pour les constantes de classe. Si vous voyez Someclass :: FOO (ou Soi-même :: Foo ou Statique :: FOO), que FOO peut-il être juste à part une constante? Et court de quelque chose de vraiment funky comme la réflexion, vous n'allez jamais voir des constantes de classe référencées comme ça.
Une convention très courante consiste à utiliser des constantes de classe dans PHP.
E.g. P>
class Message { const HOT = 0; const WARM = 1; const COLD = 2; }
Vous utiliseriez ceci comme ceci: message :: chaud code>. Je crois aussi que
message code> doit être déclaré comme
abstrait code>.
Sauf si bien sûr, la classe de messages est utilisée pour plus de choses que de simples constantes, telles que Message :: Envoyer ("bla bla", message :: chaud); code>
J'utilise également une classe avec des constitus pour cela. J'ajoute le suivant
implémenter une méthode statique __Tostring () pour faire le précédent p>
Je peux également utiliser le message :: $ Enums pour tester les variables: p>
J'ai constaté que l'utilisation de __Tostring pour cela est mal appréciée, alors que les nouvelles versions PHP plus récentes que j'utilisées ne se plaignaient. Donc, pourrait être préférable d'utiliser un nom différent pour cette fonctionnalité.
Vous voudrez peut-être regarder les deux premières réponses à Cette question sur Stackoverflow mentionner à la fois p>