2016-05-12 51 views
2

有人可以澄清如何检查用户定义函数中的标志。PHP:检查在用户定义函数中设置了哪些标志

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

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

编辑:

Flags must be powers of 2 in order to bitwise-or together properly. PHP function flags, how?

这应该解决

define('GLOB_CUSTOM', 64); 
+0

这甚至不会为我运行。 'define('GLOB_CUSTOM',092364023760); #PHP解析错误:第1行上的php shell代码中的数字文字无效。其他一切似乎都如预期。 – miken32

+1

[如何在php中实现位掩码?](http://stackoverflow.com/questions/11880360/how-to-implement-a-bitmask-in-php) – miken32

+1

以'0开头的数字被认为是八进制(参见[link](http://php.net/manual/en/language.types.integer.php))。该系统中没有“9”(或者完整性为“8”),因此它是无效的。在PHP7之前,这被默默地忽略并被视为零。查看链接中的红色警告。你的'GLOB_CUSTOM'实际上是'0'。 – ccKep

回答

2

In test one why is GLOB_CUSTOM showing as set ?

GLOB_CUSTOM被定义为123和$flags问题被设置为168。该掩蔽结果在

$flags & GLOB_CUSTOM - > 40

因为你只是测试if($flags & GLOB_CUSTOM)而不是if($flags & GLOB_CUSTOM === GLOB_CUSTOM)你的函数显示错误的结果。

你应该更好地使用开关盒。

我认为这也是解决问题的2号

What does the value of the var_dump($flags) represent(where did that number come from)?

,如果你把这个数字的二进制表示,你会看到你的标志的所有定义的位。

相关问题