2012-11-07 43 views
3

//您好,我想排除與位運算的標誌,但我不知道如何: //這是一個標誌位(他們來自filesystemiterator)PHP的逐位標誌檢測操作

define('CURRENT_AS_FILEINFO', 0); 
define('CURRENT_AS_SELF', 16); 
define('CURRENT_AS_PATHNAME', 32); 
define('CURRENT_MODE_MASK', 240); 
define('KEY_AS_PATHNAME', 0); 
define('KEY_AS_FILENAME', 256); 
define('FOLLOW_SYMLINKS', 512); 
define('KEY_MODE_MASK', 3840); 
define('NEW_CURRENT_AND_KEY', 256); 
define('SKIP_DOTS', 4096); 
define('UNIX_PATHS', 8192); 

用戶可以設置任何標誌組合。 我需要檢測是否CURRENT_AS_SELF或CURRENT_AS_PATHNAME設置, 所以這裏是我的功能至今:

function containsPathnameOrSelfFlag($flags) { 
    if ($flags & (CURRENT_AS_PATHNAME | CURRENT_AS_SELF)) { 
     return true; 
    } 
    return false; 
} 

,這裏是一個測試套件:

var_dump(containsPathnameOrSelfFlag(CURRENT_MODE_MASK | CURRENT_AS_PATHNAME)); // true, ok 
var_dump(containsPathnameOrSelfFlag(CURRENT_AS_FILEINFO)); // false, ok 
var_dump(containsPathnameOrSelfFlag(CURRENT_MODE_MASK | CURRENT_AS_FILEINFO)); // true, but false was expected, because neither CURRENT_AS_SELF nor CURRENT_AS_SELF were set, so my function is wrong 

是否有可能使用位運算符來使函數通過第三種情況 (它應該返回false) ?

我看到這裏的問題是,CURRENT_MODE_MASK的位重疊CURRENT_AS_SELF 和CURRENT_AS_PATHNAME的位:

0000000000010000 : CURRENT_AS_SELF 
0000000000100000 : CURRENT_AS_PATHNAME 
0000000011110000 : CURRENT_MODE_MASK 
0000000100000000 : KEY_AS_FILENAME 
0000001000000000 : FOLLOW_SYMLINKS 
0000111100000000 : KEY_MODE_MASK 
0000000100000000 : NEW_CURRENT_AND_KEY 
0001000000000000 : SKIP_DOTS 
0010000000000000 : UNIX_PATHS 

所以每次用戶CURRENT_MODE_MASK添加的旗幟,我的功能 會以爲CURRENT_AS_SELF和CURRENT_AS_PATHNAME也設置了,儘管情況並非如此。 我不知道如何解決這個問題。

+0

更改CURRENT_MODE_MASK? –

+0

CURRENT_MODE_MASK確實設置了CURRENT_AS_SELF和CURRENT_AS_PATHNAME標誌...將其更改爲0000000011000000# –

+0

感謝您的回答,但標誌來自FilesystemIterator類,我無法更改它們,但也許我誤解了CURRENT_MODE_MASK的工作方式 – ling

回答

3

面具的目的是反對測試的當前值,而不是用新的代值進行評估。如果您想測試是否存在或僅使用一個標誌,則只使用該標誌。

+0

感謝您的回答。 「面具的目的是與目前的測試價值相比較,而不是用新的代價來衡量。」 你的意思是說,如果一個用戶像這樣構造FilesystemIterator,他錯了嗎? $ o = new FilesystemIterator(__ DIR__,FilesystemIterator :: CURRENT_AS_FILEINFO | FilesystemIterator :: CURRENT_MODE_MASK); 如果是這樣,那麼我的問題不應該發佈,我的問題就解決了(或者至少不是真正的用例) – ling

+1

正確。應使用掩碼將感興趣的特定標誌與'getFlags()'隔離,而不是爲新迭代器設置標誌。 –

+0

感謝精確度,很難找到有關該標誌的有用信息。 php的文檔只會說:Masks FilesystemIterator :: current(),這對某些人來說可能是可以理解的(唉,對我而言),我創建的唯一「文檔」在這裏http://chat.stackoverflow.com/成績單/ 11/2011/3/20/8-21,這也讓我感到困惑。現在我想我明白了。謝謝。 – ling

1

如果你不想CURRENT_MODE_MASKCURRENT_AS_SELFCURRENT_AS_PATHNAME重疊只是確保他們不共享公共位設置爲1 您可以設置CURRENT_MODE_MASK至64或192,以適應當前的值,例如。

+0

感謝您的回答,但我無法更改CURRENT_MODE_MASK的值,它來自FilesystemIterator類:http://www.php.net/manual/en/class.filesystemiterator.php。我不確定如何理解CURRENT_MODE_MASK的工作方式,也許它不應該與CURRENT_AS_SELF和CURRENT_AS_PATHNAME一起使用,但當用戶使用CURRENT_MODE_MASK和(CURRENT_AS_SELF或CURRENT_AS_PATHNAME)標誌設置標誌時,不會引發錯誤。 – ling