Php 何时调用SplHeap::isCorrupted?

Php 何时调用SplHeap::isCorrupted?,php,heap,Php,Heap,抽象类提供了以下方法: 告知堆是否处于损坏状态 public SplHeap::isCorrupted ( void ) : bool 我想知道这个方法如何有用,更不用说堆如何被破坏了。人们会期望内部堆实现是可靠的,并且永远不会损坏 起初,我认为可能可以直接访问底层数组,这将允许这样的操作(类似于Python的heapq实现): $heap=new SplMinHeap(); $heap->insert(9); $heap->insert(5); echo$heap->top();//5. $

抽象类提供了以下方法:

告知堆是否处于损坏状态

public SplHeap::isCorrupted ( void ) : bool
我想知道这个方法如何有用,更不用说堆如何被破坏了。人们会期望内部堆实现是可靠的,并且永远不会损坏

起初,我认为可能可以直接访问底层数组,这将允许这样的操作(类似于Python的
heapq
实现):

$heap=new SplMinHeap();
$heap->insert(9);
$heap->insert(5);
echo$heap->top();//5.
$heap[0]=10;//使堆不一致?--不可能
堆的内部数据结构是私有的。上述堆的
var_dump
呈现如下:

object(SplMinHeap)#1(3){
[“标志”:“SplHeap”:private]=>int(0)
[“isCorrupted”:“SplHeap”:private]=>bool(false)
[“heap”:“SplHeap”:private]=>数组(2){
[0]=>int(5)
[1] =>int(9)
}
}
作为另一种可能性,我认为内存约束可能会导致堆损坏,但在这种情况下,让任何修改方法(
insert
extract
,…)引发异常并使堆保持其原始状态似乎更为有用


所以我的问题是:为什么我们需要调用
$heap->isCorrupted()
,在哪种情况下它会返回
true

当用户定义的
compare
函数中发生异常时,堆可能会损坏。有关的文档包含以下内容:

警告
SplHeap::compare()
中抛出异常会损坏堆并将其置于阻塞状态。您可以通过调用
SplHeap::recoverfromcruption()
来取消阻止它。但是,某些元素可能放置不正确,因此可能会破坏heap属性

例如,此脚本将生成损坏的堆:

final类MySplHeap扩展SplHeap{
受保护函数比较($a,$b){
echo“比较$a和$b\n”;//查看正在发生的情况非常有用。。。
如果($a==$b)返回0;
如果($a>$b)返回1;
抛出新异常(“我的错误”);
}
}
$heap=new MySplHeap();
试一试{
$heap->insert(3);
$heap->insert(2);
$heap->insert(1);
$heap->insert(4);//比较方法在此处引发错误
}捕获(例外$e){}
var_dump($heap->isCorrupted());//布尔(真)
echo$heap->extract();//RuntimeException:堆已损坏,不再确保堆属性。
由于错误,无法将值4放置在堆中的正确位置

显而易见的补救办法是确保比较函数中不会出现异常