<?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;
}
}

运行结果:

PHP学习之分页类的更多相关文章

  1. php大力力 [019节]php分页类的学习

    2015-08-26 php大力力019.php分页类的学习 [2014]兄弟连高洛峰 PHP教程14.2.1 分页需求分析 14:18 [2014]兄弟连高洛峰 PHP教程14.2.2 分页类中分页 ...

  2. php分页类学习

    分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据.在互联网上,分​页是一般用于搜索结果或是浏览全部信息(比如:一个论坛主题).几乎在每一个W ...

  3. Yii2中自带分页类实现分页

    1.首先写控制器层 先引用pagination类 use yii\data\Pagination; 写自己的方法: function actionFenye(){        $data = Fie ...

  4. php 自己写的好看的分页类

    自己写的一个分页类 ,不是很完整,个别没有做验证,但可以使用,分页效果见文章底部.除了链接数据库的代码没有粘贴上来,其他的都粘贴了.供学习使用- <?php /** * Created by P ...

  5. 自定义MVC框架之工具类-分页类的封装

    以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前 ...

  6. python---django中自带分页类使用

    请先看在学习tornado时,写的自定义分页类:思路一致: python---自定义分页类 1.基础使用: 后台数据获取: from django.core.paginator import Pagi ...

  7. php实现的分页类

    php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...

  8. asp.net的快捷实用分页类

    KeleyiPager分页类,可以于对列表页进行分页浏览,代码是从HoverTreeCMS项目中COPY的,感觉很不错,使用简单方便,但是功能强大. 在线体验效果:http://cms.hovertr ...

  9. php分页类

    1.需求 学会php分页类的使用 2.参考例子 CI的分页类 3.代码部分 <?php class pagination{ public $pagesize=20; public $pagein ...

随机推荐

  1. 4.闭锁 CountDownLatch

    /*CountDownLatch 闭锁*/ CountDownLatch 是一各同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 闭锁可以延迟线程的进度 直到 其到达终 ...

  2. 实现Vue的双向绑定

    一.概述 之前有讲到过vue实现整体的整体流程,讲到过数据的响应式,是通过Object.defineProperity来实现的,当时只是举了一个小小的例子,那么再真正的vue框架里是如何实现数据的双向 ...

  3. macro 标签,和静态文件,以及templates

    1 模板 -Templates 1 什么是模板 模板,在Flask中就是允许响应给用户看的网页在模板中,允许包含“占位变量”来表示动态的内容 模板最终也会被解析成字符串再响应给客户端,这一过程通常称为 ...

  4. Linux命令——gzip、zcat、bzip2、bzcat、tar

    参考:Linux命令——ar 为什么文件要压缩? 当文件过大时,无论是本地做备份,复制都很麻烦,而且还浪费磁盘空间.如果用网络传输,大文件无疑会浪费大量宝贵带宽.文件压缩技术可以有效解决这个问题,但是 ...

  5. Springboot项目中的favicon

    当项目还不大的时候,打开浏览器的favicon是自带的小叶子,如下图 此时,我们只需要将我们想要的favicon命令为favicon.ico放置在resource下,重启服务即可改变图标 当项目越来越 ...

  6. Codeforces 567D - One-Dimensional Battle Ships - [树状数组+二分]

    题目链接:https://codeforces.com/problemset/problem/567/D 题意: 在一个 $1 \times n$ 的网格上,初始摆放着 $k$ 只船,每只船的长度均为 ...

  7. ZZNUOJ-2155-单身man集合-【标程做法:数位DP-1-10^8,提前暴力打表法: 砍时间复杂度到10^5】

    ZZNUOJ-2155: 单身MAN集合 题目描述: 单身man们突然集结起来了,虽然我们不知道它们想要干什么.你作为单身man的首领需要管理好每一只单身man,机智的你给每一只单身man编了一个编号 ...

  8. HttpClient获取数据

    HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议 ...

  9. 四、vue基础--自定义组件

    1.语法:Vue.component("组件名字",{data,template}),代码如下: a. data: 必须是一个函数,有一个返回值.和vue里面的使用方法一样 b. ...

  10. Warning: (1260, 'Row xxx was cut by GROUP_CONCAT()')

    MySql数据库查询时,使用group_concat报错“Row XXX was cut by GROUP_CONCAT()”,查了下是因为group_concat有个最大长度的限制,超过最大长度就会 ...