HTML Pagination Generator
Your code looks clean. The suggested changes below mainly focuses on reducing it a bit, so IMO improving its readability.
But I'm not quite sure it'll also improve performance as you said you're interested to: I only hope some light gain could come from having suppressed your $makeanchor() function.

Changes I propose affect only your main paginationControl() function:

public function paginationControls(BaseList $list, $parameter = 'page') {

    if (!isset($list-&gt;pagination)) {
        return 'Error: List has not been supplied with pagination details.';
    }

    // if total results are less than the results displayed on each page
    // then do not render controls
    if ($list-&gt;pagination-&gt;perpage &gt;= $list-&gt;pagination-&gt;total) {
        return null;
    }

    // Keep track of current query string parameters
    $query = preg_replace('/' . $parameter . '\=\d+\&amp;?/', '', $_SERVER['QUERY_STRING']);
    if ($query) {
        $query .= '&amp;';
    }
    $query .= $parameter . '=';

    $page = $list-&gt;pagination-&gt;page;
    $pages = ceil($list-&gt;pagination-&gt;total / $list-&gt;pagination-&gt;perpage);

    // Prepare link to first page, if needed
    if ($page &gt; 3) {
      $pageSet['1...'] = FALSE;
    }
    // Prepare link to 3 pages before + current + 3 pages after
    for ($i = $page - 3; $i &lt;= $page + 3; $i++) {
      if ($i AND $i &lt;= $pages) {
        $pageSet[$i] = ($i == $page);
      }
    }
    // Prepare link to last page, if needed
    if ($i &lt; $pages) {
      $pageSet['...' . $pages] = FALSE;
    }

    // Build output
    $output = NULL;
    $classes = 'pagination anchor';
    foreach ($pageSet as $pageNo =&gt; $current) {
      $output .= $this-&gt;a(
        ($current ? '#' : '?' . $query . $pageNo),
        $pageNo,
        NULL,
        ($classes . ($current ? 'current' : NULL))
      );
    }

    return $output;
}


Apart from the way to build pagination, you'll notice that:


I dropped trim(..., '&amp;') from your $query = ..., since "&amp;" has already suppressed by preg_replace(); otherwise it sounds like you suspect the whole query to abusively include an ending "&amp;"
at the just next line, I dropped strlen() from if ($query), which is enough (and may be slightly faster, but it is only cosmetic)