цитаты
«Идея не очень хорошая, правда. Вам лучше передать несколько логических значений. Если вы хотите использовать побитовое значение, тогда
function someFunc($options)
{
if ($options & 1 != 0)
//then option 1 enabled
if ($options & (1 << 1) != 0)
//then option 2 enabled
if ($options & (1 << 2) != 0)
//then option 3 enabled
}
"
То, что вы сделали, было бы хорошо, если бы вы проверяли одно значение, хотя и не оптимально, поэтому проверяли, что бит включен, но давайте предположим, что мы хотим иметь возможность сопоставить любое значение, или точно, мы могли бы методы
function matchExact($in, $match) { // meets your criterion, as would a switch, case, but ultimately not suited for use with flags
return $in === $match;
}
function matchAny($in, $match) { // meets original criterion with more lexical name however it returns true if any of the flags are true
return $in |= $match;
}
если вы затем захотите расширить это, выполнив определенные действия, только если бит x, y, z включен, тогда вы можете использовать следующее
function matchHas($in, $match) { // more bitwise than === as allows you to conditionally branch upon specific bits being set
return $in &= $match;
}
Я также думаю, что если вы делаете то, что было сделано в приведенной выше цитате, флаги могут быть не лучшей идеей, точные значения могут быть лучше, что дает преимущество, позволяя делать более осторожные действия. (0-255) для 8-битных более 8 различных флагов
Причина, по которой флаги работают так хорошо, в том, что в базе 2 «8» не содержит «4», а «2» не содержит «1».
________________________
|8|4|2|1|Base 10 Value |
------------------------
|1|1|1|1|15 |
|1|1|1|0|14 |
|1|1|0|1|13 |
|1|1|0|0|12 |
|1|0|1|1|11 |
|1|0|1|0|10 |
|1|0|0|1|9 |
|1|0|0|0|8 |
|0|1|1|1|7 |
|0|1|1|0|6 |
|0|1|0|1|5 |
|0|1|0|0|4 |
|0|0|1|1|3 |
|0|0|1|0|2 |
|0|0|0|1|1 |
|0|0|0|0|0 |
------------------------