我认为应该注意 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;
?>
希望这能帮助到某人。