class ReadingList extends SplStack {
}
$myBooks = new ReadingList();
foreach (
$myBooks as $book) {
    echo 
$book "n"// prints last item first!
}
class ReadingList extends SplQueue { }

$myBooks = new ReadingList();

// add some items to the queue
$myBooks[] = 'A Feast of Crows';
// $myBooks->enqueue('test str 2');
// $myBooks->dequeue()('test str 2');

echo $myBooks->bottom();
echo 
$myBooks->top();

SPL (PHP>=5.3.0) provides a basic heap, minheap, maxheap, and a specialized data type called a Priority Queue.

<?php
class Dijkstra
{
  protected 
$graph;

  public function 
__construct($graph) {
    
$this->graph $graph;
  }

  public function 
shortestPath($source$target) {
    
// array of best estimates of shortest path to each
    // vertex
    $d = array();
    
// array of predecessors for each vertex
    $pi = array();
    
// queue of all unoptimized vertices
    $Q = new SplPriorityQueue();

    foreach (
$this->graph as $v => $adj) {
      
$d[$v] = INF// set initial distance to "infinity"
      $pi[$v] = null// no known predecessors yet
      foreach ($adj as $w => $cost) {
        
// use the edge cost as the priority
        $Q->insert($w$cost);
      }
    }

    
// initial distance at source is 0
    $d[$source] = 0;

    while (!
$Q->isEmpty()) {
      
// extract min cost
      $u $Q->extract();
      if (!empty(
$this->graph[$u])) {
        
// "relax" each adjacent vertex
        foreach ($this->graph[$u] as $v => $cost) {
          
// alternate route length to adjacent neighbor
          $alt $d[$u] + $cost;
          
// if alternate route is shorter
          if ($alt $d[$v]) {
            
$d[$v] = $alt// update minimum length to vertex
            $pi[$v] = $u;  // add neighbor to predecessors
                           //  for vertex
          }
        }
      }
    }

    
// we can now find the shortest path using reverse
    // iteration
    $S = new SplStack(); // shortest path with a stack
    $u $target;
    
$dist 0;
    
// traverse from target to source
    while (isset($pi[$u]) && $pi[$u]) {
      
$S->push($u);
      
$dist += $this->graph[$u][$pi[$u]]; // add distance to predecessor
      $u $pi[$u];
    }

    
// stack will be empty if there is no route back
    if ($S->isEmpty()) {
      echo 
"No route from $source to $targetn";
    }
    else {
      
// add the source node and print the path in reverse
      // (LIFO) order
      $S->push($source);
      echo 
"$dist:";
      
$sep '';
      foreach (
$S as $v) {
        echo 
$sep$v;
        
$sep '->';
      }
      echo 
"n";
    }
  }
}
// struttura che mappa un vertice con gli altri vertici e relative distanze
// es, A dista B 3, A dista D 3, A dista F 6
$graph = array(
  
'A' => array('B' => 3'D' => 3'F' => 6),
  
'B' => array('A' => 3'D' => 1'E' => 3),
  
'C' => array('E' => 2'F' => 3),
  
'D' => array('A' => 3'B' => 1'E' => 1'F' => 2),
  
'E' => array('B' => 3'C' => 2'D' => 1'F' => 5),
  
'F' => array('A' => 6'C' => 3'D' => 2'E' => 5),
);
$g = new Dijkstra($graph);

$g->shortestPath('D''C');  // 3:D->E->C
$g->shortestPath('C''A');  // 6:C->E->D->A
$g->shortestPath('B''F');  // 3:B->D->F
$g->shortestPath('F''A');  // 5:F->D->A
$g->shortestPath('A''G');  // No route from A to G