2012-01-25 9 views
6

Possible Duplicate:
Workaround for basic syntax not being parsedindicadores de bits que combina en una constante de PHP clase

estoy tratando de permitir a los desarrolladores especificar cualquier combinación de bits para especificar qué partes de los datos que desea incluir en una respuesta.

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

      // .... 
    } 

Esto funciona en el sentido de que cuando una instancia de la clase como esta:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL); 

Esta lógica sería ejecutado:

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

Todo esto funciona muy bien, excepto yo' Me gustaría definir 'bits de acceso directo' algo así como BUILD_DATE_ALL que sería el valor de la suma de todos los bits relacionados con la FECHA, por lo que solo tienen que especificar esa constante de acceso directo en lugar de cada uno individualmente.

he intentado esto, pero genera un error:

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

También probé diferentes enfoques/sintaxis:

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

y otro enfoque Traté:

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

El error Me sale es:

ErrorException: syntax error, unexpected '('

y el error que consigo por los otros enfoques es:

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

Parece que PHP no quiere calcular demasiado en una definición constante y sólo quiere un solo valor en lugar de valor derivado. Supongo que esto se basa en el hecho de que no quiere paréntesis ni quiere el | para hacer más cálculos. Además, traté de usar '-' en lugar de | solo para probar mi teoría ... y sí, se quejó de que el + también era inesperado.

¿Cómo puedo solucionar el problema para poder definir un 'bit de acceso directo' que es una suma de un rango de las otras constantes ya definidas.

+0

Debe definir esa constante con un valor numérico simple (desde agregar las banderas usted mismo). – mario

+0

Desde [docs] (http://php.net/manual/en/language.oop5.constants.php), se agregó soporte de expresión constante en PHP 5.6.0. Entonces su siguiente enfoque inicial no arrojaría un error. 'const BUILD_DATE_ALL = (self :: BUILD_DATE_RFC | self :: BUILD_DATE_SQL | self :: BUILD_DATE_SQLTIME | self :: BUILD_DATE_UNIX);' – GreeKatrina

Respuesta

6

Puede calcularlo usted mismo. Como estos son indicadores de bits, hay un patrón.

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 poco molesto porque quería mostrar los bits que realmente se incluyen para que otro desarrollador pueda verlo y resolverlo, pero para eso están los comentarios.Esta solución alternativa es lo que implementaré. ¡Gracias! – WhiskeyTangoFoxtrot

+8

Si configura 'BUILD_DATE_ALL = -1', entonces no necesitaría resolverlo, porque' -1' establece todos los bits en 1 de todos modos. La mejor práctica para una bandera ALL. – worldofjr

1

citando del Manual:

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 | el operador es el resultado de una operación, por lo tanto, no está permitido

+1

que es muy desafortunado que PHP solo permita primitivas. ¿Esto ocurre con otros idiomas también? – WhiskeyTangoFoxtrot

Cuestiones relacionadas