ビットマスクに苦労しています (またはビットフィールドですか?)。もうどうしたらいいのかわからない。
フィルタリング対象のフラグを受け入れる DirectoryFilterIterator を作成したいと考えています。そのためにこれらのビットを使用すると思いました:
const DIR_NO_DOT = 1;
const DOT = 2;
const DIR = 3;
const FILE = 4;
aDOT
も a と見なされるDIR
ため、これら 2 つも区別できるようにしたいと思います。私が正しければ、次のようにできるはずだと思いました。
DirectoryFilterIterator::DIR & ~DirectoryFilterIterator::DOT
言い換えれば、これは.DIR
でない限り除外する必要がありDOT
ます。しかし、フィルタリングを(メソッドで)機能させる方法に完全に行き詰まっていますaccept
:
class DirectoryFilterIterator
extends FilterIterator
{
const DIR_NO_DOT = 1;
const DOT = 2;
const DIR = 3;
const FILE = 4;
protected $_filter;
public function __construct( DirectoryIterator $iterator, $filter = self::DIR )
{
parent::__construct( $iterator );
$this->_filter = $filter;
}
public function accept()
{
$item = $this->getInnerIterator()->current();
return (
!( ( $this->_filter & self::DOT ) == self::DOT && $item->isDot() ) &&
!( ( $this->_filter & self::DIR ) == self::DIR && $item->isDir() ) &&
!( ( $this->_filter & self::FILE ) == self::FILE && $item->isFile() )
);
}
}
...特に、私が行っているすべての否定のせいで、私はちょっと迷っています。これを正しく機能させるにはどうすればよいですか?