我認為應該注意的是,IT_MODE_* 常數在類別內定義為
IT_MODE_LIFO => int(2)
IT_MODE_FIFO => int(0)
IT_MODE_DELETE => int(1)
IT_MODE_KEEP => int(0)
由於 FIFO 和 KEEP 旗標都定義為零,當您嘗試使用位元推演來辨別已啟用的模式時,可能會遇到歧義,考量到位元設定迭代器模式的方式(至少在 v5.3.5 中是如此,尚未測試其他版本),您可能會被誤導。
請考慮以下範例
<?php
$l = new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);
$mode = $l->getIteratorMode(); var_dump(($mode & SplDoublyLinkedList::IT_MODE_FIFO) == SplDoublyLinkedList::IT_MODE_FIFO); var_dump(($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO); var_dump(($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE); var_dump(($mode & SplDoublyLinkedList::IT_MODE_KEEP) == SplDoublyLinkedList::IT_MODE_KEEP); ?>
無論 getIteratorMode 告訴您什麼,據我所知,該物件的確正確地遵守了已設定的配置。
您應該這樣做(至少在他們添加更多選項之前)
基本上,您應該只檢查非零旗標 (LIFO(2) 和 DELETE(1))。由於在配對中是非此即彼的情況,這應該可以幫助您找出實例已設定的個別模式片段。
範例
<?php
$l = new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);
$mode = $l->getIteratorMode();
$isLIFO = ($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO;
$isDELETE = ($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE;
?>
希望這個例子對某些人有幫助。