2016-05-12 26 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)?

,如果你把這個數字的二進制表示,你會看到你的標誌的所有定義的位。

相關問題