PHP:检查在用户定义的函数中设置了哪些标志

时间:2016-05-12 17:24:31

标签: php logical-operators

有人可以澄清如何在用户定义的函数中检查标志。

这些常量是预定义的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_BRACEGLOB_MARKGLOB_NOSORTGLOB_NOCHECK显示为什么?
  • var_dump($flags)的价值代表什么(该数字来自哪里)?

How to implement a bitmask in php?是我开始的地方,我从接受的答案中建立了我的榜样。不幸的是,它没有解释上述任何一点。

编辑:

  

标志必须是2的幂才能按位或一起正确。PHP function flags, how?

这应解决问题

define('GLOB_CUSTOM', 64);

1 个答案:

答案 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)的值代表什么(该数字来自哪里)?

如果您使用此数字的二进制表示,您将看到标志的所有已定义位。