Pergunta

Possível duplicata:
Solução alternativa para sintaxe básica que não está sendo analisada

Estou tentando permitir que os desenvolvedores especifiquem qualquer combinação de bits para especificar quais dados eles desejam incluir em uma resposta.

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

           // ....
   }

Isso funciona no sentido de que quando eu instanciar a classe assim:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL);

Esta lógica seria executada:

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

Tudo isso funciona perfeitamente, exceto que eu gostaria de definir 'bits de atalho' algo como BUILD_DATE_ALL que seria o valor da soma de todos os bits relacionados a DATE, para que eles só precisem especificar essa constante de atalho em vez de cada um individualmente.

Eu tentei isso, mas gera um erro:

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

Também tentei diferentes abordagens/sintaxes:

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

e outra abordagem que tentei:

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

O erro que recebo é:

ErroExceção:erro de sintaxe, inesperado '('

e o erro que recebo para as outras abordagens é:

ErroExceção:erro de sintaxe, '|' inesperado, esperando ',' ou ';'

Parece que o PHP não quer calcular muito em uma definição constante e quer apenas um valor único em vez de um valor derivado.Estou assumindo que isso com base no fato de que não deseja parênteses nem querer o | para fazer mais cálculos.Além disso, tentei usar '-' em vez de | só para testar minha teoria ..e sim, reclamou que o + também era inesperado.

Como faço para corrigir o problema para poder definir um 'bit de atalho' que é a soma de um intervalo de outras constantes já definidas.

Foi útil?

Solução

Você mesmo pode calcular.Como estes são sinalizadores de bits, existe um padrão.

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

Outras dicas

Citando o manual:

O valor deve ser uma expressão constante e não (por exemplo) uma variável, uma propriedade, um resultado de uma operação matemática ou uma chamada de função.

Uso do | O operador é o resultado de uma operação, portanto não é pemitida

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top