2012-01-25 18 views
6

Possible Duplicate:
Workaround for basic syntax not being parsedCombinare flag di bit in una classe costante PHP

sto cercando di consentire agli sviluppatori di specificare qualsiasi combinazione di bit per specificare quali parti dei dati che vogliono inclusi in una risposta.

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

      // .... 
    } 

Questo funziona, nel senso che quando un'istanza della classe in questo modo:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL); 

Questa logica sarebbe stato giustiziato:

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

Tutto questo funziona a meraviglia, tranne I' Mi piacerebbe definire 'bit di scelta rapida' qualcosa come BUILD_DATE_ALL quale sarebbe il valore della somma di tutti i bit relativi alla DATA in modo che debbano solo specificare quella costante di scelta rapida piuttosto che ciascuno individualmente.

Ho provato questo, ma genera un errore:

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

Ho anche provato diversi approcci/sintassi:

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

e un altro approccio che ho provato:

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

L'errore Ottengo:

ErrorException: syntax error, unexpected '('

e l'errore che ottengo per gli altri approcci è:

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

Sembra PHP non vuole calcolare troppo in una definizione costante e vuole solo un singolo valore, piuttosto che valore derivato. Suppongo che questo si basi sul fatto che non vuole parentesi né vuole il | fare ulteriori calcoli. Inoltre, ho provato a usare '-' invece di | solo per testare la mia teoria .. e sì, si lamentava del fatto che il + fosse inaspettato.

Come risolvere il problema in modo da poter definire un "bit di scelta rapida" che è la somma di un intervallo delle altre costanti già definite.

+0

è necessario definire che costante con un valore numerico pianura (di aggiungere le bandiere da soli). – mario

+0

Da [docs] (http://php.net/manual/en/language.oop5.constants.php), il supporto per l'espressione costante è stato aggiunto in PHP 5.6.0. Quindi il tuo prossimo approccio iniziale non genererebbe un errore. 'const BUILD_DATE_ALL = (self :: BUILD_DATE_RFC | self :: BUILD_DATE_SQL | self :: BUILD_DATE_SQLTIME | self :: BUILD_DATE_UNIX);' – GreeKatrina

risposta

6

È possibile calcolarlo autonomamente. Poiché questi sono bit flag, esiste un modello.

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

Un po 'fastidioso perché volevo mostrare i bit in modo che fossero inclusi in modo che un altro sviluppatore potesse guardarlo e capirlo, ma è a questo che servono i commenti.Questa soluzione alternativa è ciò che implementerò. Grazie! – WhiskeyTangoFoxtrot

+8

Se si imposta 'BUILD_DATE_ALL = -1', non sarà necessario elaborarlo, poiché' -1' imposta tutti i bit su 1 in ogni caso. Le migliori pratiche per una bandiera ALL. – worldofjr

1

Citando dal manuale:

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

uso del | l'operatore è il risultato di un'operazione, pertanto non è stato programmato

+1

che è molto spiacevole che PHP permetta solo le primitive. Questo si verifica anche con altre lingue? – WhiskeyTangoFoxtrot

Problemi correlati