PHP第十七篇——分页与实现

经常在网上看到分页的出现,最近没事。看看公司的后台代码,对这个小模块进行封装。制作成一个函数。现在将自己的这个思考过程,写下来。

分页与实现

逻辑准备

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

属性{
    数据总条数
    每一页显示的条数
    计算出总页数
    获取当前是第几页
    显示上一页
    显示下一页
    显示首页
    显示尾页
    每一页的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 < 1)
    {
        $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'] 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定
坚持原创技术分享,您的支持将鼓励我继续创作!