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