Pregunta

posible duplicado:
solución para la sintaxis básica que no se analiza

Estoy tratando de permitir que los desarrolladores especifiquen cualquier combinación de bits para especificar qué piezas de datos desean incluidas 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 creo que instancia de la clase así:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL);

Esta lógica se ejecutará:

    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 bellamente, excepto que me gustaría definir "bits de acceso directo", algo como Build_Date_all, que sería el valor de la suma de todas las bits relacionadas con la fecha, por lo que solo tienen que especificar ese constante de acceso directo en lugar de cada uno. individualmente.

Intenté esto, pero arroja 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 que intenté:

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

El error que recibo es:

ErrorException: Error de sintaxis, inesperado '('

y el error que recibo para los otros enfoques es:

ErrorException: Error de sintaxis, inesperado '|', esperando ',' o ';'

Parece que php no quiere calcular demasiado en una definición constante y solo quiere un valor único en lugar de valor derivado. Supongo que esto basado en el hecho de que no quiere paréntesis ni quiere el | para hacer más cálculos. Además, intenté usar '-' en lugar de | Solo para probar mi teoría .. Y sí, se quejó de que también sea inesperado.

¿Cómo voy a arreglar el problema para que pueda definir un 'bit de atajo' que es una suma de un rango de las otras constantes ya definidas?

¿Fue útil?

Solución

Puedes calcularlo tú mismo.Como estos son banderas 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;
       // ....
}

Otros consejos

citando desde el manual:

El valor debe ser una expresión constante, no (por ejemplo) una variable, una propiedad, un resultado de una operación matemática o una llamada de función.

uso de los |El operador es el resultado de una operación, por lo tanto, no pemada

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top