天天看点

php面向对象分页,PHP面向对象(OOP)——分页类

同验证码类,分页也是在个人博客,论坛等网站中不可缺少的方式,通过分页可以在一个界面展示固定条数的数据,而不至于将所有数据全部罗列到一起,实现分页的原理其实就是对数据库查询输出加了一个limit限制,接下来我们就开始准备今天分页类的逻辑

逻辑准备

实现分页,我们需要获取准备以下属性和方法

属性{

数据总条数

每一页显示的条数

计算出总页数

获取当前是第几页

显示上一页

显示下一页

显示首页

显示尾页

每一页的url

数据限制limit

}

方法{

构造函数

计算总页数

获取当前页

获取上一页

获取下一页

获取首页

获取尾页

获取当前页面url

获取上一页url

获取下一页url

获取首页url

获取尾页irl

生成limit记录

重新生成url地址

显示分页链接,显示分页情况

}

根据上面的逻辑,下一步将文字转换为代码

首先,我们先声明一个Page类,按照逻辑进行属性声明,并且进行初始化

class Page

{

//记录总条数

protected $total;

//每页显示几条

protected $nums;

//总页数

protected $totalPages;

//当前页码

protected $currentPage;

//上一页页码

protected $prevPage;

//下一页页码

protected $nextPage;

//首页页码

protected $firstPage;

//尾页页码

protected $endPage;

//url

protected $url;

//limit,传到数据库的limit

protected $limit;

//构造函数,初始化

public function __construct($total, $nums)

{

$this->total = $total;

$this->nums = $nums;

$this->totalPages = $this->getTotalPages();

$this->currentPage = $this->getCurrentPage();

$this->getPrevPage();

$this->getNextPage();

$this->getFirstPage();

$this->getEndPage();

$this->getUrl();

}

}

接下来我们开始完善方法

计算总页数

protected funciton getTotalPages()

{

return ceil($this->total / $this->$nums);

}

获取当前页码

protected function getCurentPage()

{

//判断如果存在page参数并且page大于0,返回实际值,否则返回1

if(isset($_GET['page']) && intval($_GET['page']) > 0)

{

$this->currentPage = intval($_GET['page']);

} else {

$this->currentPage = 1;

}

return $this->currentPage;

}

获取上一页

protected function getPrevPage()

{

$this->prevPage = $this->currentPage - 1;

if($this->prevPage

{

$this->prevPage = 1;

}

return $this->prevPage;

}

获取下一页

protected function getNextPage()

{

$this->nextPage = $this->currentPage + 1;

return $this->nextPage;

}

获取首页

protected function getFirstPage()

{

$this->firstPage = 1;

return $this->firstPage;

}

获取尾页

protected function getEndPage()

{

$this->endPage = $this->totalPages;

return $this->endPage;

}

接下来开始拼接每个页码的url

获取当前页的url

protected function getCurrentUrl()

{

return $this->url.'$page='.$this->currentPage;

}

获取前一页的url

protected function getPrevUrl()

{

return $this->url.'&page='.$this->prevPage;

}

获取下一页的url

protected function getNextUrl()

{

return $this->url.'&page='.$this->nextPage;

}

获取首页的url

protected function getFirstUrl()

{

return $this->url.'&page='.$this->firstPage;

}

获取尾页的url

protected function getEndUrl()

{

return $this->url.'&page='.$this->endPage;

}

生成limit记录

public function limit()

{

return ($this->currentPage - 1) * $this->nums.','.$this->nums;

}

生成url地址

public function getUrl()

{

//获取当前页面的文件位置

$url = $_SERVER['REQUEST_URI'];

//将url参数解析成数组

$parse = parse_url($url);

//获得域名地址

$path = $parse['path'];

//获取参数

$query = isset($parse['query']) ? $parse['query'] : false;

//如果有参数,把page这个参数先给干掉,因为我们要重新拼接

if($query)

{

parse_str($query,$query);

//干掉page参数,保留其他参数

unset($query['page']);

//http_build_query拼将参数拼接成请求

$uri = $parse['path'].'?'.http_build_query($query);

} else {

$uri = rtrim($parse['path'],'?').'?';

}

//智能识别https和http协议和端口号

$protocal = (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';

switch ($_SERVER['SERVER_PORT']) {

case 80:

case 443:

$uri = $protocal.$_SERVER['SERVER_NAME'].$uri;

break;

default:

$uri = $protocal.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$uri;

break;

}

$this->url = $uri;

}

到此所有的逻辑方面都已经处理完啦,接下来的render()函数用来显示分页的链接

public function render()

{

return array(

['first' => $this->getFirstUrl()],

['prev' => $this->getPrevUrl()],

['current' => $this->getCurrentUrl()],

['next' => $this->getNextUrl()],

['end' => $this->getEndUrl()]

);

}

哦也,就这么愉快的结束啦

使用方法如下

//new一个对象

$page = new Page(102,10);

//打印出来上页/下页/首页/尾页……的url

var_dump($page->render());

后记

$url = http://www.zhyunfe.com/OOP/Page.class.php?page=1

parse_url($url):将url的文件路径和参数分开并保存到数组中

..........................................

. array (size=2)

. 'path' => string '/OOP/Page.class.php' (length=36)

. 'query' => string 'page=1' (length=6)

..........................................

...

$query = "page=1&num=2&sex=男"

parse_str($query,$query):将带参数的字符串解析成数组

..........................................

. array

. 'page' => 1

. 'num' => 2

. 'sex' => '男'

..........................................

...

$query = ['num'=>1,'sex'=>'男']

http_build_query($query):使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。

.........................................

. string

. "num=1&&sex='男'"

.........................................

...

$_SERVER['SERVER_PORT'] 获取端口号

$_SERVER['SERVER_NAME'] 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定