У вас не просто сумма - у вас есть набор флагов или битовое поле, каждый из которых представлен одним битом.
$logging = !!($cfgval & 1);
$errorReport = !!($cfgval & 2);
$emailReport = !!($cfgval & 4);
"!!" просто гарантирует, что числа, которые не равны 0 (т. е. числа с заданным битом), в конечном итоге будут иметь то же «истинное» значение, которое использует остальная часть PHP, поэтому такие вещи, как ($logging == true)
, всегда работают как положено. Это не обязательно, но я настоятельно рекомендую как-то преобразовать значение в логическое значение; (bool)
также будет работать, даже если в 3 раза больше символов. :)
Пока вы сохраняете числа в виде степеней двух (1, 2, 4, 8, 16, 32 ...), легко расширить это до 31-32 различных флагов (целые числа имеют размер 32 бита). , но верхний бит является знаковым битом, который выглядит довольно забавно, если вы не знаете о математике "два дополнения").