有人可以澄清如何在用户定义的函数中检查标志吗?
这些常量是预定义的 glob 标志。
- GLOB_BRACE
- GLOB_MARK
- GLOB_NOSORT
- GLOB_NOCHECK
- GLOB_NOESCAPE
- GLOB_ERR
- GLOB_ONLYDIR
我创建了一个新的只是为了测试。
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)
的价值代表什么(这个数字从哪里来(?
如何在 php 中实现位掩码? 是我开始的地方,我从接受的答案构建我的例子。不幸的是,它没有解释上述任何一点。
编辑:
标志必须是 2 的幂才能正确按位或组合。PHP函数标志,如何?
这应该可以解决问题
define('GLOB_CUSTOM', 64);
在测试一中,为什么GLOB_CUSTOM显示为设置?
而GLOB_CUSTOM
定义为 123,$flags
设置为 168。掩蔽结果为
$flags & GLOB_CUSTOM
-> 40
而且因为你只是测试if($flags & GLOB_CUSTOM)
而不是if($flags & GLOB_CUSTOM === GLOB_CUSTOM)
你的函数显示错误的结果。
您最好使用开关盒。
我认为这也解决了问题 2
var_dump($flags(的值代表什么(该数字从何而来(?
如果您采用此数字的二进制表示形式,您将看到标志的所有已定义位。