分頁是 Web 開發基礎組件。本文深度解析兩種風格迥異的 PHP 分頁類:模板驅動型(Page 類)支援高度自定義 HTML 結構;陣列輸出型(Page_Link 類)專注邏輯計算,輸出結構化數據供前端渲染。兩者各有優勢,適用不同架構場景。
特點:內建模板引擎,支援 {total}、{list}、{frist} 等佔位符,可通過 setTemplate()、setActiveTemplate() 靈活定制輸出。
getOffset() 直接獲取 SQL LIMIT 偏移量__get('limit') 返回 LIMIT offset, size<?php
$page = new Page();
$page->init(1000, 20); // 總記錄 1000,每頁 20
$page->setTemplate('<div class="pager">{frist}{pre}{list}{next}{last}{goto}</div>');
$page->setActiveTemplate('<span class="current">{text}</span>');
$page->setNotActiveTemplate('<a href="{url}">{text}</a>');
echo $page->show();
// SQL 查詢
$offset = $page->getOffset();
// 或直接用 $page->limit
$sql = "SELECT * FROM articles LIMIT {$page->limit}";
?>
特點:不輸出 HTML,返回結構化陣列,包含 url、name、no、attr 等鍵值,適合 API 接口、前後端分離、自定義模板引擎(Smarty/Twig/Blade)場景。
make_page($total, $act_page, $url, $param):基礎分頁,返回頁碼陣列make_page_with_total(...):包含總頁數信息make_page_with_points(...):支援省略號(...)、首尾頁、上下頁、自定義樣式(</>、<</>>)類內部實現了 Calculation_Min_Max(),根據總頁數、最大顯示頁碼數(page_max)、當前頁自動計算顯示範圍:
<?php
$pager = new Page_Link();
$pager->page_max = 8; // 最多顯示 8 個頁碼
$pager->length = 15; // 每頁 15 條
$pager->isNextPage = true;
$pager->isFirstPage = true;
$result = $pager->make_page_with_points(
$totalCount, // 總記錄數
$currentPage, // 當前頁
$baseUrl, // 基礎 URL
8, // 最大顯示頁碼
2, // 樣式:< / >
'page' // 分頁參數名
);
// 模板渲染 (Twig 示例)
/*
<nav class="pagination">
{% for item in result %}
{% if item.url %}
<a href="{{ item.url }}" {% if item.attr == 'current' %}class="current"{% endif %}>{{ item.name }}</a>
{% else %}
<span class="current">{{ item.name }}</span>
{% endif %}
{% endfor %}
</nav>
*/
?>
| 維度 | Page (模板驅動) | Page_Link (陣列輸出) |
|---|---|---|
| 輸出形式 | HTML 字符串 | PHP 陣列 |
| 模板靈活性 | 高(佔位符替換) | 極高(前端完全控制) |
| 適用架構 | 傳統 MVC、單頁應用服務端渲染 | API、前後端分離、現代模板引擎 |
| 學習成本 | 低 | 中(需理解陣列結構) |
| 擴展性 | 中(修改模板) | 高(數據結構穩定) |
src/Pagination/,配置 composer.json。PaginationInterface,支援多種實現互換。UrlGeneratorInterface,適配 Laravel/ThinkPHP/Symfony 路由。PaginationResult 物件替代陣列,提供類型提示。