2009-07-26 9 views
6

Mam jeden obiekt PHP5 przekazujący wiadomości do innego i chciałbym dołączyć typ do każdej wiadomości. Na przykład: MSG_HOT, MSG_WARM i MSG_COLD. Jeśli PHP5 miał typ wyliczeniowy, prawdopodobnie użyłbym tego do zdefiniowania typów wiadomości, ale (o ile się nie mylę) nie ma takiego zwierzęcia. Szukałem w kilku opcjach:Alternatywa dla typów wyliczeniowych w PHP5?

smyczki ('MSG_HOT', 'MSG_WARM' i 'MSG_COLD') są złe, ponieważ chciałbym nieuchronnie wpisać coś 'MSG_WRAM' i rzeczy pęknie. Liczby cierpią na ten sam problem i są również mniej jasne.

Definiuje praca:

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

ale zanieczyszczać globalnej przestrzeni nazw, a więc wymaga nazwy Bardziej szczegółowa, aby zapewnić niepowtarzalność. Wolałbym, aby mój kod nie był zaśmiecony takimi rzeczami jak APPLICATIONNAME_MESSAGES_TYPE_HOT.

Wreszcie mogę używać nazw klas rozróżnić typy, tak:

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

To jest dobre, myślę, ale jest też dużo pracy za to, co wydaje się, że to powinno być proste pojęcie .

Czy brakuje mi lepszej alternatywy?

Odpowiedz

13

Bardzo częstym konwencja jest użycie stałych klasy w PHP.

np.

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

Użyjesz tego w ten sposób: 'Message :: HOT'. Uważam również, że "Wiadomość" powinna być zadeklarowana jako "abstrakcyjna". – philfreo

+0

O ile oczywiście klasa Message jest używana dla więcej rzeczy niż tylko utrzymywanie stałych, takich jak 'Message :: Send (" bla bla ", Message :: HOT);' –

1

Można użyć class constants:

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

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

Heh, przysięgam to nie było na stronie, gdy odpowiadałem. Greg, większość standardów kodowania PHP (PEAR, Zend itp.) Wymaga użycia CAŁKICH CZAPEK do stałych nazw. Z pewnością pomaga w rozpoznawaniu kodu. – hobodave

+0

Konwencja taka jak ta jest bardzo ważna, gdy tworzysz swoje stałe z definicją (chociaż uważam, że wszystko jest brzydkie, więc wolę prefiks "k", jak w kConstantName), ale to naprawdę nie jest konieczne dla stałych klasowych . Jeśli widzisz SomeClass :: foo (lub self :: foo lub static :: foo), co jeszcze może być poza stałą? Poza tym, że coś jest naprawdę funky jak odbicie, zobaczycie tylko stałe klas, do których się odwołujemy. –

5

Używam również do tego klasy z const. Dodam następujące

  • dokonać klasa abstrakcyjna, aby upewnić się, że nikt nie próbuje instancję
  • dodać statyczną tablicę, która odwzorowuje consts do strun do drukowania przyjazne komunikaty
  • wdrożenie statycznego __toString () metoda zrobić poprzedni

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

mogę również użyć Wiadomość :: $ teksty stałe przetestować zmienne:

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

Stwierdzono, że używanie __toString do tego jest nierozważne, ponieważ nowsze wersje PHP, których używałem, narzekają na to. Najlepiej więc użyć innej nazwy dla tej funkcji. – grantwparks