如何在PHP中实现位掩码?

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

在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页面的术语掩码

无论如何,这一点是,我已经实现了一个叫做ls的SIMPLE方法,它返回一个目录的内容。

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

所以当我打电话的function,我设置了我想要的结果。 是否我想要结果返回隐藏的目录,是否我只想要基本名称等

所以当我打电话给我正在写的function

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

我认为这将是更可读,如果我可以只标记我想如何返回数据?

所以像这样:

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

等等…

我将如何实现这个testing哪些标志被称为?

实际上这很简单。 首先介绍一下如何实现它的代码。 如果您对代码的工作原理或工作原理不了解,请随时在注释中提出其他问题:

 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.也可以将标志定义为string,在这种情况下,可用标志的数量或多或less是无限的(当然在系统资源的范围内)。 这是二进制的工作原理(为简单起见,缩减为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时会发生什么 FLAG_1 | FLAG_3

  00000001 | 00000100 = 00000101 

当你想看看哪些标志被设置,你和位标志的位掩码。 所以,让我们看看上面的结果,看看是否设置了FLAG_3

  00000101 & 00000100 = 00000100 

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

  00000101 & 00000010 = 00000000 

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

 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 } 

其他人提供了很好的build议,但是现在传递关联数组而不是位掩码更为常见。 它更具可读性,允许您传递其他variables,而不仅仅是true / false值。 像这样的东西:

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