PHP面向對象(OOP)----分頁類

同驗證碼類,分頁也是在我的博客,論壇等網站中不可缺乏的方式,經過分頁能夠在一個界面展現固定條數的數據,而不至於將全部數據所有羅列到一塊兒,實現分頁的原理其實就是對數據庫查詢輸出加了一個limit限制,接下來咱們就開始準備今天分頁類的邏輯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'] 當前運行腳本所在的服務器的主機名。若是腳本運行於虛擬主機中,該名稱是由那個虛擬主機所設置的值決定
相關文章
相關標籤/搜索