从需求来写类
先要写出需求 了解需要哪些方法 需要哪些参数 然后在进行编写
分页 需要输入总页数 每页有多少个数据 每次显示多少个页码
类中通过计算 算出地址
地址计算 先判读是否有参数 参数中有? 所以判读是否有问号即可 strpos($_SERVER["REQUEST_URI"], '?')
parse_url($url) 返回一个关联数字 分析url
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
parse_str() 函数把查询字符串解析到变量中。
parse_str("id=23&name=John%20Adams",$myArray);
print_r($myArray);
Array ( [id] => 23 [name] => John Adams )
魔术方法
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。
上一节中,我们为每个属性做了设置和获取的方法,在
PHP5
中给我们提供了专门为属性设置值和获取值的方法,“
__set()
”和“
__get()
”这两个方法,这两个方法不是默认存在的,
而是我们手工添加到类里面去的,像构造方法
(__construct())
一样
,
类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:
//__get()
方法用来获取私有属性
private function
__get(
$
property_name
)
{
if
(
isset
(
$
this
->
$
property_name
))
{
return
(
$
this
->
$
property_name
);
}
else
{
return
(
NULL
);
}
}
//__set()
方法用来设置私有属性
private function
__set(
$
property_name
,
$
value
)
{
$
this
->
$
property_name
=
$
value
;
}
__get()
方法:这个方法用来获取私有成员属性值的
,
有一个参数,
参数传入你要获取的成员属性的名称,返回获取的属性值,
这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,
是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:“
echo $p1->name
”
这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用“
echo $p1->name
”
这样的语句直接获取值的时候就会自动调用
__get($property_name)
方法,将属性
name
传给参数
$property_name
,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。
__set()
方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上
了,
如果没有
__set()
这个方法,是不允许的,
比如:
$this->name=
‘
zhangsan’
,
这样会出错,但是如果你在类里面加上了
__set($property_name, $value)
这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如
name
传给
$property_name,
把要赋的值“
zhangsan
”传给
$value
,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,
还可以在这个方法给做一下判断。
然后通过需求在编写类中的方法
首页 上一页 下一页 尾页 等这些标志可以放到数组中 用户可以进行修改
页码数 让选中的页码放到中间 然后获取前后的页数
添加一个参数,让用户可以自行添加参数
1 <?php 2 class Page { 3 private $total; //数据表中总记录数 4 private $listRows; //每页显示行数 5 private $limit; 6 private $uri; 7 private $pageNum; //页数 8 private $config=array('header'=>"个记录", "prev"=>"上一页", "next"=>"下一页", "first"=>"首 页", "last"=>"尾 页"); 9 private $listNum=8; 10 /* 11 * $total 12 * $listRows 13 */ 14 public function __construct($total, $listRows=10, $pa=""){ 15 $this->total=$total; 16 $this->listRows=$listRows; 17 $this->uri=$this->getUri($pa); 18 $this->page=!empty($_GET["page"]) ? $_GET["page"] : 1; 19 $this->pageNum=ceil($this->total/$this->listRows); 20 $this->limit=$this->setLimit(); 21 } 22 23 private function setLimit(){ 24 return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}"; 25 } 26 27 private function getUri($pa){ 28 $url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?").$pa; 29 echo $url; 30 $parse=parse_url($url); 31 32 33 34 if(isset($parse["query"])){ 35 parse_str($parse['query'],$params); 36 unset($params["page"]); 37 $url=$parse['path'].'?'.http_build_query($params); 38 39 } 40 41 return $url; 42 } 43 44 private function __get($args){ 45 if($args=="limit") 46 return $this->limit; 47 else 48 return null; 49 } 50 51 private function start(){ 52 if($this->total==0) 53 return 0; 54 else 55 return ($this->page-1)*$this->listRows+1; 56 } 57 58 private function end(){ 59 return min($this->page*$this->listRows,$this->total); 60 } 61 62 private function first(){ 63 if($this->page==1) 64 $html.=''; 65 else 66 $html.=" <a href='{$this->uri}&page=1'>{$this->config["first"]}</a> "; 67 68 return $html; 69 } 70 71 private function prev(){ 72 if($this->page==1) 73 $html.=''; 74 else 75 $html.=" <a href='{$this->uri}&page=".($this->page-1)."'>{$this->config["prev"]}</a> "; 76 77 return $html; 78 } 79 80 private function pageList(){ 81 $linkPage=""; 82 83 $inum=floor($this->listNum/2); 84 85 for($i=$inum; $i>=1; $i--){ 86 $page=$this->page-$i; 87 88 if($page<1) 89 continue; 90 91 $linkPage.=" <a href='{$this->uri}&page={$page}'>{$page}</a> "; 92 93 } 94 95 $linkPage.=" {$this->page} "; 96 97 98 for($i=1; $i<=$inum; $i++){ 99 $page=$this->page+$i; 100 if($page<=$this->pageNum) 101 $linkPage.=" <a href='{$this->uri}&page={$page}'>{$page}</a> "; 102 else 103 break; 104 } 105 106 return $linkPage; 107 } 108 109 private function next(){ 110 if($this->page==$this->pageNum) 111 $html.=''; 112 else 113 $html.=" <a href='{$this->uri}&page=".($this->page+1)."'>{$this->config["next"]}</a> "; 114 115 return $html; 116 } 117 118 private function last(){ 119 if($this->page==$this->pageNum) 120 $html.=''; 121 else 122 $html.=" <a href='{$this->uri}&page=".($this->pageNum)."'>{$this->config["last"]}</a> "; 123 124 return $html; 125 } 126 127 private function goPage(){ 128 return ' <input type="text" οnkeydοwn="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'&page=\'+page+\'\'}" value="'.$this->page.'" style="width:25px"><input type="button" value="GO" οnclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'&page=\'+page+\'\'"> '; 129 } 130 function fpage($display=array(0,1,2,3,4,5,6,7,8)){ 131 $html[0]=" 共有<b>{$this->total}</b>{$this->config["header"]} "; 132 $html[1]=" 每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-{$this->end()}</b>条 "; 133 $html[2]=" <b>{$this->page}/{$this->pageNum}</b>页 "; 134 135 $html[3]=$this->first(); 136 $html[4]=$this->prev(); 137 $html[5]=$this->pageList(); 138 $html[6]=$this->next(); 139 $html[7]=$this->last(); 140 $html[8]=$this->goPage(); 141 $fpage=''; 142 foreach($display as $index){ 143 $fpage.=$html[$index]; 144 } 145 146 return $fpage; 147 148 } 149 150 151 }