//您好,我想排除與位運算的標誌,但我不知道如何: //這是一個標誌位(他們來自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也設置了,儘管情況並非如此。 我不知道如何解決這個問題。
更改CURRENT_MODE_MASK? –
CURRENT_MODE_MASK確實設置了CURRENT_AS_SELF和CURRENT_AS_PATHNAME標誌...將其更改爲0000000011000000# –
感謝您的回答,但標誌來自FilesystemIterator類,我無法更改它們,但也許我誤解了CURRENT_MODE_MASK的工作方式 – ling