PHP,分页函数封装成类

来源:互联网 发布:fifaonline3国服数据库 编辑:程序博客网 时间:2024/05/16 15:00
最近因为项目用到php。查看文档,基本看懂怎么用,怎么说呢,很多特性或者习惯,习惯了python,就觉得php很多不可理喻之处。当然,可能我对于php的造化尚浅吧。
写了一个分页函数,然后封装成类,一边其他地方调用。不足之处,就是这个分页没有提供ajax无刷新。有时间,再改得更健壮。
文档结构
pageing
+css
index.css
+class
Page.class.php
index.php


//index.php

<?php/* Report all errors except E_NOTICE */error_reporting(E_ALL ^ E_NOTICE);//设置utf-8编码header('Content-Type:text/html;charset=utf-8');//设置硬路径define('ROOT_PATH',dirname(__FILE__));//引入 分页类,当然还可以改写为自动加载require ROOT_PATH.'/Page.class.php';//分页入口,创建对象 传入三个参数,总数据条目,每页显示条目,当前页前后间隔数$_page = new Page(20,5,3);   echo $_page->limit;echo '<br />';print_r($_page->url);?><!doctype html><html><head><title>分页类</title><link rel="stylesheet" type="text/css" href="css/index.css"></head><body><div style="margin:100px 0 0 0;"><div id="page"><?phpecho $_page->showPage();?></div></div></body></html> 
//index.css
@CHARSET "UTF-8";body,h1,h2,h3,p,form,ul,ol,li,dl,dt,dd {padding:0;margin:0;}body {background:#fff;font-size:12px;}#page {text-align:center;padding:10px;}#page a {border:1px solid #666;padding:2px 5px;margin:0 2px;}#page a:hover,#page span.me {color:#fff;border:1px solid #000;background:#000;text-decoration:none;}#page span.disabled {border:1px solid #ccc;padding:2px 5px;margin:0 2px;color:#ccc;}#page span.me {padding:2px 5px;margin:0 2px;}

// Page.calss.php

<?phpclass Page{private $total;//总记录数,即数据库的record数private $page;//当前页数private $pagesize;//每页显示的条目数private $pagenum;//页码数private $limit;//查询数据库的分页参数private $url;//获取地址private $bothnum;//获取当前页前后间隔数//构造函数,初始化字段,传入总条目数$_total,通常是查询数据库后返回的值,每页显示条目数$_pagesize,获取当前页前后间隔数$bothnumpublic function __construct($_total,$_pagesize,$bothnum){$this->total    = $_total;$this->pagesize = $_pagesize;$this->pagenum  = ceil($this->total / $this->pagesize);$this->page     = $this->setPage();$this->url      = $this->setUrl();$this->bothnum  = $bothnum;$this->limit    = 'LIMIT '.($this->page-1) * $this->pagesize.','.$this->pagesize;}public function __get($_key){return $this->$_key;}//获取传过来的当前页private function setPage(){if(!empty($_GET['page'])){if($_GET['page'] > 0){if($_GET['page'] < $this->pagenum){return $_GET['page'];}else{return $this->pagenum;}}else{return 1;}}else{return 1;}}//获取地址private function setUrl(){$_url = $_SERVER['REQUEST_URI'];       //获取地址,包含完整路径和查询字符串$_par = parse_url($_url);//将$_url拆分为数组 path->路径,query-> 查询字符串if(isset($_par['query'])){parse_str($_par['query'],$_query);//将查询字符串按照连接符分组,组成一个数组,例如 action->show,page->5unset($_query['page']);//销毁 查询字符串的page组 只剩下前面的 action$_url = $_par['path'].'?'.http_build_query($_query);//将剩下的查询字符串数组指向 action->show转行成 action=show}return $_url;}//数字分页private function pageList(){for($i=($this->page - $this->bothnum);$i<$this->page;$i++){if($i < 1) continue;$_pageList .= '<a href="'.$this->url.'&page='.$i.'"  title="">'.$i.'</a>';}$_pageList .= '<span class="me">'.$this->page.'</span>';for($i=($this->page+1);$i<=($this->page + $this->bothnum);$i++){if($i > $this->pagenum) break;$_pageList .= '<a href="'.$this->url.'&page='.$i.'"  title="">'.$i.'</a>';}return $_pageList;}//首页private function first(){return '<a href="'.$this->url.'&page=1">首页</a>...';}//上一页private function prev(){return '<a href="'.$this->url.'&page='.($this->page-1).'">上一页</a>';}//下一页private function next(){return '<a href="'.$this->url.'&page='.($this->page+1).'">下一页</a>';}//尾页private function last(){return '...<a href="'.$this->url.'&page='.$this->pagenum.'">尾页</a>';} //对外接口函数,用来显示分页页码public function showPage(){$_page .= $this->first();$_page .= $this->pageList();$_page .= $this->last();$_page .= $this->prev();$_page .= $this->next();return $_page;}}?>


代码解析
1.构造函数 __construct 用来初始化字段,将入口传入的总条目数,每页显示数和当前页前后间隔数。
2. 获取当前页码函数 setPage,如果传空值或者小于零的值,则页码数指向第一页,如果页码大于总页数,则指向最后一页。
3 捕捉地址方法 setUrl;为了让分页类在其他地方也能调用,分离出传过来的url路径。$_SERVER['REQUEST_URI']获取完整的url,包含主机路径和查询字符串。
>parse_url 函数,将完整路径切割成数组,一项为网址路径 path ,一项为查询字符串query。这里为 action=show?page=2
>parse_str 函数 将查询字符串 再分割成一个数组 例如 [action->show,page->2],
unset 函数 销毁 page系列 ,因为每次点击页码都会传新的。
最后返回 包含查询字符串的硬路径,没有传分页参数
4.分页间隔控制 pageList方法 确定当前页,先向前循环间隔数 ,当当前页小于首页的时候,跳出当前循环。然后向后循环间隔数,当当前页大于总页数是停止循环,返回循环的字符串。用来宣示分页
5.首页尾页上下页方法
6.对外接口,用来执行私有方法,返回分页字符串,用来前台显示。


源码分享  下载地址