2009-07-26 7 views
6

J'ai un objet PHP5 qui transmet des messages à un autre, et j'aimerais attacher un type à chaque message. Par exemple, MSG_HOT, MSG_WARM et MSG_COLD. Si PHP5 avait un type enum, je l'utiliserais probablement pour définir les types de message, mais (à moins que je ne me trompe) il n'y a pas un tel animal. Je l'ai regardé quelques options:Alternative aux types enum dans PHP5?

Cordes ('MSG_HOT', 'MSG_WARM' et 'MSG_COLD') sont mauvais parce que je taperais inévitablement quelque chose comme 'MSG_WRAM' et les choses se briser. Les numéros souffrent du même problème et sont également moins clairs.

définit le travail:

define('MSG_HOT', 1); 
define('MSG_WARM', 2); 
define('MSG_COLD', 3); 

mais pollue l'espace de noms global, et aurait donc besoin de noms plus verbeux pour garantir l'unicité. Je préférerais ne pas avoir mon code jonché de choses comme APPLICATIONNAME_MESSAGES_TYPE_HOT.

Enfin, je pourrais utiliser les noms de classe pour distinguer les types, comme ceci:

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; 
} 

Ce qui est bon, je pense, mais aussi beaucoup de travail pour ce qui semble, il devrait être un concept simple .

Est-ce qu'il me manque une meilleure alternative?

Répondre

13

Une convention très courante consiste à utiliser des constantes de classe en PHP.

par exemple.

class Message 
{ 
    const HOT = 0; 
    const WARM = 1; 
    const COLD = 2; 
} 
+5

Vous utiliseriez ceci comme suit: 'Message :: HOT'. Je crois aussi que 'Message' devrait être déclaré comme' abstract'. – philfreo

+0

À moins bien sûr, la classe Message est utilisée pour plus de choses que simplement garder des constantes, comme 'Message :: Send (" bla bla ", Message :: HOT);' –

1

Vous pouvez utiliser class constants:

class Message 
{ 
    const hot = 0; 
    const warm = 1; 
    const cold = 2; 
} 

foo(Message::hot); 
foo(Message::warm); 
foo(Message::cold); 
+1

Heh, je le jure n'était pas sur la page quand j'ai répondu. Greg, la plupart des standards de codage PHP (PEAR, Zend, etc.) requièrent l'utilisation de ALL CAPS pour les noms de constante. Cela aide certainement à la reconnaissance du code. – hobodave

+0

Une convention comme celle-ci est très importante lorsque vous créez vos constantes avec define (bien que je trouve des majuscules minuscules, donc je préfère un préfixe 'k', comme dans kConstantName), mais ce n'est vraiment pas nécessaire pour les constantes de classe . Si vous voyez SomeClass :: foo (ou self :: foo ou static :: foo), quoi d'autre peut-il être en plus d'une constante? Et à court de quelque chose de vraiment génial comme la réflexion, vous ne verrez que des constantes de classe référencées comme ça. –

5

J'utilise aussi une classe avec consts pour cela. Ajouter les éléments suivants

  • faire la classe abstraite, pour vous assurer que personne ne cherche à instancier
  • ajouter un tableau statique qui associe les consts à cordes pour l'impression des messages sympathiques
  • mettre en œuvre un __toString statique () méthode pour faire la précédente

    abstract class Message { 
        const HOT = 0; 
        const WARM = 1; 
        const COLD = 2; 
    
        public static $enums= array(
         self::HOT => "hot", 
         self::WARM => "warm", 
         self::COLD => "cold" 
        ); 
    
        public static __toString($enum) { 
         return self::$enums[$enum]; 
        } 
    } 
    

Je peux aussi utiliser le message :: $ énumérations pour tester les variables:

if (!array_key_exists($is_it_valid, Message::$enums) 
+0

Trouvé que l'utilisation de __toString pour cela est mal avisé, en tant que nouvelles versions de PHP que j'utilisais se plaignent à ce sujet. Donc, peut-être préférable d'utiliser un nom différent pour cette fonctionnalité. – grantwparks