2012-01-25 16 views
6

Possible Duplicate:
Workaround for basic syntax not being parsedŁączenie bit flagi w klasie stałej PHP

Próbuję pozwolić deweloperom określić dowolną kombinację bitów określić, które elementy danych Chcą zawartych w odpowiedzi.

class ClassName { 
      const BUILD_DATE_RFC = 1; 
      const BUILD_DATE_SQL = 2; 
      const BUILD_DATE_SQLTIME = 4; 
      const BUILD_DATE_UNIX = 8; 

      // .... 
    } 

Działa to w tym sensie, że kiedy instancję klasy tak:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL); 

Ta logika byłaby wykonane:

if (self::BUILD_DATE_RFC & $this->metaBits) { 
     $dateMeta['RFC'] = date('r'); 
    } 
    if (self::BUILD_DATE_SQL & $this->metaBits) { 
     $dateMeta['SQL'] = date('Y-m-d'); 
    } 
    if (self::BUILD_DATE_SQLTIME & $this->metaBits) { 
     $dateMeta['SQL_time'] = date('Y-m-d H:i:s'); 
    } 

Wszystko to działa pięknie, z wyjątkiem I Chciałbyś zdefiniować "bity skrótów" podobne do BUILD_DATE_ALL, które byłyby wartością sumy wszystkich bitów związanych z DATE, więc muszą tylko określić tę stałą skrótu, a nie każdą indywidualnie.

próbowałem tego, ale zgłasza błąd:

const BUILD_DATE_ALL = (self::BUILD_DATE_RFC|self::BUILD_DATE_SQL|self::BUILD_DATE_SQLTIME|self::BUILD_DATE_UNIX); 

Próbowałem również różne podejścia/składni:

const BUILD_REQUEST_ALL = self::BUILD_IP | 
       self::BUILD_USERAGENT | 
       self::BUILD_REFERER; 

i innego podejścia próbowałem:

const BUILD_DEFAULT = self::BUILD_DATE_ALL|self::BUILD_REQUEST_ALL^self::BUILD_REFERER^self::BUILD_USERAGENT; 

błędu Otrzymuję:

ErrorException: syntax error, unexpected '('

i błąd pojawia się w przypadku innych metod to:

ErrorException: syntax error, unexpected '|', expecting ',' or ';'

Wygląda jak PHP nie chce obliczyć zbyt dużo w stałej definicji i chce tylko pojedynczą wartość zamiast wartości pochodnej. Zakładam, że jest to oparte na tym, że nie chce nawiasów ani nie chce | wykonać dalsze obliczenia. Dodatkowo próbowałem użyć '-' zamiast | żeby przetestować moją teorię ... i tak, narzekało też na to, że + jest nieoczekiwane.

Jak mam rozwiązać problem, aby zdefiniować "bit skrótu", który jest sumą zakresu innych już zdefiniowanych stałych.

+0

Musisz zdefiniować tę stałą ze zwykłą wartością numeryczną (od samodzielnego dodawania flag). – mario

+0

Z [docs] (http://php.net/manual/en/language.oop5.constants.php) dodano obsługę stałego wyrażenia w PHP 5.6.0. Zatem Twoje pierwsze podejście nie spowodowałoby błędu. 'const BUILD_DATE_ALL = (self :: BUILD_DATE_RFC | self :: BUILD_DATE_SQL | self :: BUILD_DATE_SQLTIME | self :: BUILD_DATE_UNIX);' – GreeKatrina

Odpowiedz

6

Możesz to obliczyć samodzielnie. Ponieważ są to flagi bitowe, istnieje wzorzec.

class ClassName { 
     const BUILD_DATE_RFC = 1; 
     const BUILD_DATE_SQL = 2; 
     const BUILD_DATE_SQLTIME = 4; 
     const BUILD_DATE_UNIX = 8; 
     const BUILD_DATE_ALL = 15; // 15 = 1|2|4|8; 
     // .... 
} 
+1

Trochę irytujące, ponieważ chciałem pokazać, że bity są rzeczywiście dołączane, więc inny programista może na nie spojrzeć i zrozumieć, ale po to są komentarze.To obejście jest tym, co zaimplementuję. Dzięki! – WhiskeyTangoFoxtrot

+8

Jeśli ustawisz 'BUILD_DATE_ALL = -1', to nie będziesz musiał tego sprawdzać, ponieważ' -1' ustawia wszystkie bity na 1. Najlepsza praktyka dla flagi ALL. – worldofjr

1

cytowanie z podręcznika:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

korzystania z | Operator jest wynikiem operacji, dlatego nie został wygenerowany

+1

to bardzo niefortunne, że PHP zezwala tylko na prymitywy. Czy dzieje się to również w innych językach? – WhiskeyTangoFoxtrot