PHP学习之分页类

<?php
$page = new Page(2, 40);
var_dump($page->allUrl());
class Page
{
    //每页显示多少条数据
    protected $number;
    //一共有多少条数据
    protected $totalCount;
    //当前页
    protected $page;
    //总页数
    protected $totalPage;
    //url
    protected $url;

    public function __construct($number, $totalCount)
    {
        $this->number = $number;
        $this->totalCount = $totalCount;
        //得到总页数
        $this->totalPage = $this->getTotalPage();
        //得到当前页数
        $this->page = $this->getPage();
        //得到url
        $this->url = $this->getUrl();
    }

    /**
     * 获取总页数
     *
     * @return void
     */
    protected function getTotalPage()
    {
        return ceil($this->totalCount / $this->number);
    }

    /**
     * 获取当前页码
     *
     * @return void
     */
    protected function getPage()
    {
        if (empty($_GET['page'])) {
            $page = 1;
        } elseif ($_GET['page'] > $this->totalPage) {
            $page = $this->totalPage;
        } elseif ($_GET['page'] < 1) {
            $page = 1;
        } else {
            $page = $_GET['page'];
        }
        return $page;
    }

    /**
     * 获取去掉page之后的url
     *
     * @return void
     */
    protected function getUrl()
    {
        //得到协议名
        $scheme = $_SERVER['REQUEST_SCHEME'];
        //得到主机名
        $host = $_SERVER['SERVER_NAME'];
        //得到端口号
        $port = $_SERVER['SERVER_PORT'];
        //得到路径和请求字符串
        $uri = $_SERVER['REQUEST_URI'];
        //中间做处理,要将page=5等这种字符串拼接url中,所以如果原来url中有page这个参数,我们首先需要先将原来的page参数给清空
        $uriArray = parse_url($uri);
        $path = $uriArray['path'];
        if (!empty($uriArray['query'])) {
            //首先将请求字符串变为关联数组
            parse_str($uriArray['query'], $array);
            //清除掉关联数组中的page键值对
            unset($array['page']);
            //将剩下的参数拼接为请求字符串
            $query = http_build_query($array);
            //再将请求字符串拼接到路径的后面
            if ($query != '') {
                $path = $path . '?' . $query;
            }
        }
        return $scheme . '://' . $host . ':' . $port . $path;
    }

    /**
     * 设置url
     *
     * @param [type] $str
     * @return void
     */
    protected function setUrl($str)
    {
        if (strstr($this->url, '?')) {
            $url = $this->url . '&' . $str;
        } else {
            $url = $this->url . '?' . $str;
        }
        return $url;
    }

    /**
     * 返回所有url
     *
     * @return void
     */
    public function allUrl()
    {
        return [
            'first' => $this->first(),
            'prev' => $this->prev(),
            'next' => $this->next(),
            'end' => $this->end()
        ];
    }

    /**
     * 首页
     *
     * @return void
     */
    public function first()
    {
        return $this->setUrl('page=1');
    }

    /**
     * 下一页
     *
     * @return void
     */
    public function next()
    {
        //根据当前page得到下一页的页码
        if ($this->page + 1 > $this->totalPage) {
            $page = $this->totalPage;
        } else {
            $page = $this->page + 1;
        }
        return $this->setUrl('page=' . $page);
    }

    /**
     * 上一页
     *
     * @return void
     */
    public function prev()
    {
        if ($this->page - 1 < 1) {
            $page = 1;
        } else {
            $page = $this->page - 1;
        }
        return $this->setUrl('page=' . $page);
    }

    /**
     * 尾页
     *
     * @return void
     */
    public function end()
    {
        return $this->setUrl('page=' . $this->totalPage);
    }

    /**
     * 偏移量,方便数据库查找
     *
     * @return void
     */
    public function limit()
    {
        $offset = ($this->page - 1) * $this->number;
        return $offset . ',' . $this->number;
    }
}

运行结果:

原文地址:https://www.cnblogs.com/shengChristine/p/10941657.html