我正在这个类中实现一个SplPriorityQueue。该类包含基本上将PDOStatement对象与正确的优先级一起放置的方法。然后我有一个方法来执行队列中的所有PDOStatement对象。
测试此类时,我已将一个PDOStatement对象推入队列,然后从$this->queries_to_run->extract()
打印结果。执行此操作后,我得到了我的预期结果,但也是RuntimeExeption
,其中包含“无法从空堆中提取”的消息。我知道SplPriorityQueue本质上是一个堆下的堆,但我不知道为什么我得到我的预期结果和异常。
这是烦人的PHP代码的子集(我在初始化PriorityQueue时将提取标志设置为'both'):
$top = $this->queries_to_run->top();
//print_r($top); // Debug
while($top['priority'] === self::$UPDATE_PRIORITY || $top['priority'] === self::$REMOVAL_PRIORITY) {
print("This is the extracted node\n"); // Debug
print_r($this->queries_to_run->extract()); // Debug
}
这是我的输出:
这是提取的节点 数组([data] => PDOStatement对象([queryString] => [--omitted--])[priority] => 4)这是提取的节点
致命错误:未捕获的异常'RuntimeException',在第943行的消息'无法从空堆中提取'
我希望我提供了足够的信息。我是学生,所以我希望这个问题不是很明显
答案 0 :(得分:0)
错误来自于在每次迭代后没有检查PriorityQueue是否为空。只需插入以下内容即可修复:
$top = ($this->queries_to_run->isEmpty()) ? 0 : $this->queries_to_run->top();