PHP函数标志作为参数

时间:2014-04-24 20:39:18

标签: php function parameters flags

有人可以解释一下这是如何工作的吗?非常感谢:)

    define("FLAG_A", 1);
    define("FLAG_B", 2);
    define("FLAG_C", 4);
    function test_flags($flags=false) {
        if ($flags & FLAG_A) echo "A";
        if ($flags & FLAG_B) echo "B";
        if ($flags & FLAG_C) echo "C";
    }
    test_flags(FLAG_A|FLAG_B);

2 个答案:

答案 0 :(得分:3)

这是使用所谓的bitwise math完成的。具体来说,他们使用&(按位和)操作来检查是否设置了值。为了这里的论证,我们将使用4位数字,以保持简短。

7位二进制数字7如下:

0111

每个数字的值都是每次加倍,并且所有数字都加在一起使总数为7.细分,它的工作原理如下:

0    1    1    1
^    ^    ^    ^
|    |    |    |
8    4    2    1

所以,基本上,它是:

0 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 7

现在,使用按位数学,特别是按位数,我们可以说我们只关心某些列中的位 - 基本上,每列中的位必须为1,否则它将设置为零。所以,检查' 4'里面' 7'用逐位数学:

  0111 (7)
& 0100 (4)
______
  0100 (4)

由于此值不为零,因此我们可以确定值4在值7内。现在考虑数字11:

1    0    1    1
^    ^    ^    ^
|    |    |    |
8    4    2    1

1 * 8 + 0 * 4 + 1 * 2 + 1 * 1 = 11

尝试寻找4

  1011 (11)
& 0100 (4)
______
  0000 (0)

因为它的值为0,所以它是假的,我们可以认为数字(4)不在数字11内。

类似地,我们可以得出结论,数字4,2和1,但不是8,在7中。在11中,我们有8,2和1.通过将数字视为一系列位而不是单数值,我们可以在一个整数内存储许多标志。

绝对做一些关于按位数学的阅读,如果正确使用它会非常有用,只是不要试图将它变成一切。

答案 1 :(得分:1)

这是基于按位运算符。想想

define("FLAG_A", 0001);  // in binary form
define("FLAG_B", 0010);
define("FLAG_C", 0100);

因此,例如,$flags & FLAG_A是变量$flags和常量FLAG_A之间的按位AND。