86

我不确定位掩码是否是正确的术语。让我解释:

在 php 中,error_reporting可以通过多种方式调用该函数:

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

我从这里的 php.net 页面得到了术语位掩码

无论如何,重点是,我实现了一个名为 SIMPLE 的方法ls,该方法返回目录的内容。

这个函数需要 3 个参数...( $include_hidden = false, $return_absolute = false, $ext = false )

所以当我调用函数时,我设置了我想要的结果。我是否希望结果返回隐藏目录,是否只需要基本名称等。

所以当我调用我正在写的函数时

ls(true, false, true)
ls(false, false, true)
ls(true, true, true)
etc...

我认为如果我可以标记我希望如何返回数据,它会更具可读性?

所以像:

ls( INCLUDE_HIDDEN | HIDE_EXTS );
ls( SHOW_ABSOLUTE_PATHS | HIDE_EXTS );

ETC...

在测试调用了哪些标志方面,我将如何实现这一点?

4

3 回答 3

160

其实很简单。首先是一段代码来演示它是如何实现的。如果您不了解此代码的作用或工作原理,请随时在评论中提出其他问题:

const FLAG_1 = 0b0001; // 1
const FLAG_2 = 0b0010; // 2
const FLAG_3 = 0b0100; // 4
const FLAG_4 = 0b1000; // 8
// Can you see the pattern? ;-)

function show_flags ($flags) {
  if ($flags & FLAG_1) {
    echo "You passed flag 1!<br>\n";
  }
  if ($flags & FLAG_2) {
    echo "You passed flag 2!<br>\n";
  }
  if ($flags & FLAG_3) {
    echo "You passed flag 3!<br>\n";
  }
  if ($flags & FLAG_4) {
    echo "You passed flag 4!<br>\n";
  }
}

show_flags(FLAG_1 | FLAG_3);

演示


因为标志是整数,所以在 32 位平台上最多可以定义 32 个标志。在 64 位平台上,它是 64。也可以将标志定义为字符串,在这种情况下,可用标志的数量或多或少是无限的(当然,在系统资源的范围内)。以下是它在二进制中的工作方式(为简单起见,缩减为 8 位整数)。

FLAG_1
Dec:    1
Binary: 00000001

FLAG_2
Dec:    2
Binary: 00000010

FLAG_3
Dec:    4
Binary: 00000100

// And so on...

当您组合标志以将它们传递给函数时,您将它们组合在一起。让我们看看当我们通过时会发生什么FLAG_1 | FLAG_3

  00000001
| 00000100
= 00000101

当您想查看设置了哪些标志时,您可以将位掩码与该标志相结合。所以,让我们看看上面的结果,看看是否FLAG_3设置了:

  00000101
& 00000100
= 00000100

...我们得到标志的值,一个非零整数 - 但如果我们看到是否FLAG_2设置:

  00000101
& 00000010
= 00000000

...我们得到零。这意味着在检查值是否通过时,您可以简单地将 AND 运算的结果评估为布尔值。

于 2012-08-09T09:30:14.640 回答
17
define( "INCLUDE_HIDDEN", 0x1 );
define( "HIDE_EXTS", 0x2 );
define( "SHOW_ABSOLUTE_PATHS", 0x4 );
//And so on, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 etc..

然后,您可以检查ls函数中的各个标志:

if( $flags & INCLUDE_HIDDEN ) { //<-- note just a single &, bitwise and
    //$flags have INCLUDE_HIDDEN
}
于 2012-08-09T09:29:23.810 回答
2

其他人提出了很好的建议,但是现在传递关联数组而不是位掩码更为常见。它更具可读性,并允许您传入其他变量,而不仅仅是真/假值。像这样的东西:

myFunction(['includeHidden' => true, 'fileExts' => false, 'string' => 'Xyz']);

function myFunction($options) {
    // Set the default options
    $options += [
        'includeHidden' => false,
        'fileExts' => true,
        'string' => 'Abc',
    ];

    if ($options['includeHidden']) {
        ...
    }
    ...
}
于 2015-03-17T01:21:08.487 回答