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 < 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'] 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定
  

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容