• PHP面向对象(OOP)----分页类


    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'] 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定
      
    
  • 相关阅读:
    详述Xgboost原理
    Uncaught Error: Script error for "popper.js", needed by: bootstrap
    JS 正则表达式从地址中提取省市县
    OneThink实现多图片批量上传功能
    移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传
    PHPCMS V9添加模板自定义全局变量
    CentOS 7:如何安装防火墙?
    HTML5的fieldset标签
    PHP使用CURL详解
    asp.net+swfupload 多图片批量上传(附源码下载)
  • 原文地址:https://www.cnblogs.com/ghjbk/p/6672135.html
Copyright © 2020-2023  润新知