【问题标题】:PHP: checking which flags have been set in user defined functionPHP:检查在用户定义的函数中设置了哪些标志
【发布时间】:2016-05-12 17:24:31
【问题描述】:

有人能说明如何检查用户定义函数中的标志吗?

这些常量是预定义的全局标志。

  • 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 显示为 set ?
  • 在测试二中,为什么 GLOB_BRACE,GLOB_MARK,GLOB_NOSORTGLOB_NOCHECK 显示为 set ?
  • var_dump($flags) 的值代表什么(这个数字是从哪里来的)?

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

编辑:

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

这应该可以解决问题

define('GLOB_CUSTOM', 64);

【问题讨论】:

  • 这甚至不会为我运行。 define('GLOB_CUSTOM', 092364023760); #PHP Parse error: Invalid numeric literal in php shell code on line 1。其他一切似乎都符合预期。
  • 0 开头的数字被认为是八进制(参见link)。该系统中没有9(或8,为了完整起见),因此它是无效的。在 PHP7 之前,这被默默地忽略并视为零。请参阅链接中的红色警告。您的 GLOB_CUSTOM 实际上是 0

标签: php logical-operators


【解决方案1】:

在测试一中,为什么 GLOB_CUSTOM 显示为 set ?

GLOB_CUSTOM被定义为123,$flags被设置为168。屏蔽结果在

$flags &amp; GLOB_CUSTOM -> 40

因为您只是测试if($flags &amp; GLOB_CUSTOM) 而不是if($flags &amp; GLOB_CUSTOM === GLOB_CUSTOM),所以您的函数会显示错误的结果。

您最好使用开关盒。

我认为这也解决了第 2 个问题

var_dump($flags) 的值代表什么(这个数字是从哪里来的)?

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

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 2018-03-25
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2011-03-09
    • 2021-02-25
    相关资源
    最近更新 更多