如何在PHP中实现掩码?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (127)

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

在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,它返回目录的内容。

这个函数需要3个args...

所以当我调用这个函数时,我设置了我想要的结果。是否希望结果返回隐藏目录,。

所以当我调用函数时

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

我想,如果我能够标记数据返回的方式,那么它将更加可读性更强。

所以,就像:

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

等等..。

我如何在测试时调用哪些标志可以实现这一点?

提问于
用户回答回答于

其实很简单。首先,我给你一些代码来演示如何实现它。如果你不了解这段代码正在做什么或它是如何工作的,可以在注释中提出其他问题:

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

...我们得到零.。这意味着,在检查值是否被传递时,你可以简单地将和操作的结果计算为布尔值。

用户回答回答于
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
}

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励