Объединение битовых флагов в константе класса PHP [дубликат]


Возможный Дубликат:
Обходной путь для базового синтаксиса, который не анализируется

Я пытаюсь разрешить разработчикам указывать любую комбинацию битов, чтобы указать, какие фрагменты данных они хотят включить в ответ.

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

           // ....
   }

Это работает в том смысле, что когда я создаю экземпляр класса следующим образом:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL);

Эта логика будет выполнена:

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

Все это прекрасно работает, за исключением того, что я хотел бы определить "ярлык биты" что-то вроде BUILD_DATE_ALL, которое будет значением суммы всех битов, связанных с ДАТОЙ, поэтому им нужно только указать эту константу быстрого доступа, а не каждый в отдельности.

Я пробовал это, но это выдает ошибку:

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

Я также пробовал разные подходы/синтаксисы:

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

И еще один подход, который я попробовал:

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

Ошибка, которую я получаю, такова:

Исключение ErrorException: синтаксическая ошибка, неожиданная '('

И ошибка, которую я получаю за другие подходы таковы:

Исключение ErrorException: синтаксическая ошибка, неожиданный '|', ожидающий ','или';'

Похоже, что PHP не хочет слишком много вычислять в определении константы и просто хочет получить одно значение, а не производное значение. Я предполагаю, что это основано на том факте, что он не хочет скобок и не хочет, чтобы |выполнял дальнейшие вычисления. Кроме того, я попытался использовать "-" вместо | просто для проверки своей теории.. и да, он жаловался на то, что + тоже неожиданно.

Как мне решить проблему, чтобы я мог определить "бит быстрого доступа", который представляет собой сумму диапазона других уже определенных констант.

Author: Community, 2012-01-25

2 answers

Вы можете рассчитать это самостоятельно. Поскольку это битовые флаги, существует закономерность.

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;
       // ....
}
 6
Author: Shiplu Mokaddim, 2012-01-25 17:22:13

Цитата из руководства:

Значение должно быть постоянным выражением, а не (например) переменной, свойством, результатом математической операции или вызова функции.

Использование оператора | является результатом операции, поэтому не допускается

 1
Author: Mark Baker, 2012-01-25 17:20:21