我不确定位掩码是否是正确的术语。让我解释一下:
在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页面here
获得了术语位掩码无论如何,我已经实现了一个名为ls
的SIMPLE方法,它返回一个目录的内容。
此函数需要3个args ...($ 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 );
等...
我如何在测试已调用哪些标志方面实现这一点?
答案 0 :(得分:140)
实际上很简单。首先是一些代码来演示它是如何实现的。如果您对此代码的作用或工作原理一无所知,请随时在评论中提出其他问题:
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操作的结果作为布尔值进行评估。
答案 1 :(得分: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
}
答案 2 :(得分:3)
其他人提供了很好的建议,但是现在传递关联数组而不是位掩码更为常见。它更具可读性,允许您传入除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']) {
...
}
...
}