有人可以澄清如何在用户定义的函数中检查标志。
这些常量是预定义的glob标志。
我创建了一个新的测试版。
define('GLOB_CUSTOM', 123);
我也试过
define('GLOB_CUSTOM',0b1111011);
结果是一样的。
此函数执行传递的标志的var_dump。
function flags_test($flags = NULL) {
echo '$flags argument<br>';
var_dump($flags); // int 1073746108
echo '<br>';
if($flags & GLOB_BRACE){
echo 'FLAG : "GLOB_BRACE" is set';
var_dump(GLOB_BRACE);
echo '<br>';
}
if($flags & GLOB_MARK){
echo 'FLAG : "GLOB_MARK" is set';
var_dump(GLOB_MARK);
echo '<br>';
}
if($flags & GLOB_NOSORT){
echo 'FLAG : "GLOB_NOSORT" is set';
var_dump(GLOB_NOSORT);
echo '<br>';
}
if($flags & GLOB_NOCHECK){
echo 'FLAG : "GLOB_NOCHECK" is set';
var_dump(GLOB_NOCHECK);
echo '<br>';
}
if($flags & GLOB_NOESCAPE){
echo 'FLAG : "GLOB_NOESCAPE" is set';
var_dump(GLOB_NOESCAPE);
echo '<br>';
}
if($flags & GLOB_ERR){
echo 'FLAG : "GLOB_ERR" is set';
var_dump(GLOB_ERR);
echo '<br>';
}
if($flags & GLOB_ONLYDIR){
echo 'FLAG : "GLOB_ONLYDIR" is set';
var_dump(GLOB_ONLYDIR);
echo '<br>';
}
if($flags & GLOB_CUSTOM){
echo 'FLAG : "GLOB_CUSTOM" is set';
var_dump(GLOB_CUSTOM);
echo '<br>';
}
}
测试一个。
flags_test(GLOB_ONLYDIR); // test one
结果
$flags argument
int 168
FLAG : "GLOB_BRACE" is set
int 128
FLAG : "GLOB_MARK" is set
int 8
FLAG : "GLOB_NOSORT" is set
int 32
FLAG : "GLOB_CUSTOM" is set
int 123
测试二。
flags_test(GLOB_CUSTOM);
结果
$flags argument
int 251
FLAG : "GLOB_BRACE" is set
int 128
FLAG : "GLOB_MARK" is set
int 8
FLAG : "GLOB_NOSORT" is set
int 32
FLAG : "GLOB_NOCHECK" is set
int 16
FLAG : "GLOB_CUSTOM" is set
int 123
我有几个问题。
GLOB_CUSTOM
显示为已设置? GLOB_BRACE
,GLOB_MARK
,GLOB_NOSORT
和GLOB_NOCHECK
显示为什么? var_dump($flags)
的价值代表什么(该数字来自哪里)? How to implement a bitmask in php?是我开始的地方,我从接受的答案中建立了我的榜样。不幸的是,它没有解释上述任何一点。
编辑:
标志必须是2的幂才能按位或一起正确。PHP function flags, how?
这应解决问题
define('GLOB_CUSTOM', 64);
答案 0 :(得分:2)
在测试一中,为什么GLOB_CUSTOM显示为set?
,GLOB_CUSTOM
定义为123,$flags
设置为168.掩蔽结果
$flags & GLOB_CUSTOM
- &gt; 40
因为您只是测试if($flags & GLOB_CUSTOM)
而不是if($flags & GLOB_CUSTOM === GLOB_CUSTOM)
,您的功能会显示错误的结果。
你应该更好地使用开关盒。
我认为这也解决了第2个问题
var_dump($ flags)的值代表什么(该数字来自哪里)?
如果您使用此数字的二进制表示,您将看到标志的所有已定义位。