Объединение битовых флагов в константе класса 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 не хочет слишком много вычислять в определении константы и просто хочет получить одно значение, а не производное значение. Я предполагаю, что это основано на том факте, что он не хочет скобок и не хочет, чтобы |выполнял дальнейшие вычисления. Кроме того, я попытался использовать "-" вместо | просто для проверки своей теории.. и да, он жаловался на то, что + тоже неожиданно.
Как мне решить проблему, чтобы я мог определить "бит быстрого доступа", который представляет собой сумму диапазона других уже определенных констант.
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;
// ....
}
Цитата из руководства:
Значение должно быть постоянным выражением, а не (например) переменной, свойством, результатом математической операции или вызова функции.
Использование оператора | является результатом операции, поэтому не допускается