首页 > 编程技术 > php

PHP抽象类、接口与其应用例子

发布时间:2016-11-25 17:05

来给大家介绍一篇PHP抽象类、接口与其应用基础例子,希望能给大家带来帮助哦。

抽象类:
就是用来继承的,本身无法实例化,是用来定规范的,子类必须把父类的抽象方法全部实现
接口:
可以理解为更严格的抽象类
一是像抽象类一样,可以定规范,因为接口有个特点,实现接口就必须把里面的方法全部实现,这样项目经理就可以在接口里面定一个规范,要实现哪些函数
二是php是单继承,一个类只能有一个父类,为了解决这个问题就出现了接口,一个类可以实现多个接口
例如,考虑一个名为Media的类,它用来描述各种公开资料的共同性质,因为Media不表示真实的实体,而是一些相似的泛化表示,所以你不会希望直接对其进行实例化。为确保这种情况不会发生,可以声明这个类是抽象的。然后再由各种派生的Media类继承此抽象类,这保证了子类直接的一致性,因为在抽象类中定义的所有方法都必须在子类中实现。
声明为抽象的类必须在定义前面加上关键字abstract,如下:
abstract class Class_Name
{
 //insert attribute definitions here
 //insert mothod definitions here
}
抽象类可以确保一致性,因为任何派生类都必须实现该抽象类继承的所有抽象方法。如果没有实现抽象类中定义的任何抽象方法,将导致一个致命错误。
用抽象类还是接口
什么时候应当使用接口,什么时候该使用抽象类?这让人很困惑,也带来了很多争论。不过,以下因素可以帮助你做出决定:
•如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。
•如果必须从多个来源继承行为,就使用接口。PHP类可以继承多个接口,但不能扩展多个抽象类。
•如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。在接口中无法实现行为。

在php中date和strtotime函数都是对日期操作的,但是在生成上面date和strtotime是不一样的,一个是数字日期一个是 Unix 时间戳了,但我们都可以生成相同的日期,下面来看两个函数的例子。

php中经常会用到date函数和strtotime函数,这2个函数大家一定并不陌生,今天和大家分享下使用技巧。
strtotime — 将任何英文文本的日期时间描述解析为 Unix 时间戳

 代码如下 复制代码

date_default_timezone_set('Asia/Shanghai');
//计算昨天的时间,我们用:
date("Ymd",time()-3600);
//生成昨天的时间
date("Ymd",strtotime('yesterday'));
date("Ymd",strtotime('-1 day'));
//生成前天的时间
date("Ymd",strtotime('yesterday -1 day'));
date("Ymd",strtotime('-2 day'));
//生成3天之后的时间
date("Ymd",strtotime('+3 day'));
//生成一个月前的时间
date("Ymd",strtotime('-1 month'));
//生成下个月最后一天的时间
date("Ymd",strtotime('last day of next month'));
//下个周的星期一
date("Ymd",strtotime('next monday'));

分页处理功能是所有服务器脚本需要支持的一个功能,原理大概都是一样的获取当前页码与记录数,然后再进行一些计算之后获取从起始与结束位置的内容然后再利用php显示出来即可,下面来看看这个分页例子,后面我会详细介绍

php分页例子

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.111cn.net /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html

xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>php make page list</title>

<style type="text/CSS">

<!-- .page a:link { color: #0000FF; text-decoration: none; }

.page a:visited { text-decoration: none; color: #0000FF; }

.page a:hover { text-decoration: none; color: #0000FF; }

.page a:active { text-decoration: none; color: #0000FF; }

.page{color:#0000FF;} --> </style>

</head>

<body>

<table width="530" height="103" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> <tr> <th width="30" height="38" bgcolor="#E3E3E3" scope="col">ID</th> <th width="500" bgcolor="#E3E3E3" scope="col">title</th> </tr> <?php /* * Created on 2010-4-17 * * Order by Kove Wong */ include "conn.php";

$Page_size=10;

$result=mysql_query('select * from huazhuangpin');
$count = mysql_num_rows($result);
$page_count = ceil($count/$Page_size);

$init=1; $page_len=7; $max_p=$page_count; $pages=$page_count;

//判断当前页码

 if(empty($_GET['page'])||$_GET['page']<0){ $page=1; }else { $page=$_GET['page']; }

$offset=$Page_size*($page-1);
$sql="select * from huazhuangpin limit $offset,$Page_size"; $result=mysql_query($sql);
while ($row=mysql_fetch_array($result)) { ?> <tr> <td bgcolor="#E0EEE0" height="25px"><div align="center"> <?php echo $row['id']?> </div></td> <td bgcolor="#E0EEE"><div align="center"> <?php echo $row['title']?> </div></td> </tr> <?php } $page_len = ($page_len%2)?$page_len:$pagelen+1;//页码个数 $pageoffset = ($page_len-1)/2;//页码个数左右偏移量

$key='<div>'; $key.="<span>$page/$pages</span> "; //第几页,共几页 if($page!=1){ $key.="<a href=\"".$_SERVER['PHP_SELF']."?page=1\">第一页</a> "; //第一页 $key.="<a href=\"".$_SERVER['PHP_SELF']."?page=".($page-1)."\">上一页</a>"; //上一页 }else { $key.="第一页 ";//第一页 $key.="上一页"; //上一页 } if($pages>$page_len){ //如果当前页小于等于左偏移 if($page<=$pageoffset){ $init=1; $max_p = $page_len; }else{//如果当前页大于左偏移 //如果当前页码右偏移超出最大分页数 if($page+$pageoffset>=$pages+1){ $init = $pages-$page_len+1; }else{ //左右偏移都存在时的计算 $init = $page-$pageoffset; $max_p = $page+$pageoffset; } } } for($i=$init;$i<=$max_p;$i++){ if($i==$page){ $key.=' <span>'.$i.'</span>'; } else { $key.=" <a href=\"".$_SERVER['PHP_SELF']."?page=".$i."\">".$i."</a>"; } } if($page!=$pages){ $key.=" <a href=\"".$_SERVER['PHP_SELF']."?page=".($page+1)."\">下一页</a> ";//下一页 $key.="<a href=\"".$_SERVER['PHP_SELF']."?page={$pages}\">最后一页</a>"; //最后一页 }else { $key.="下一页 ";//下一页 $key.="最后一页"; //最后一页 } $key.='</div>'; ?> <tr> <td colspan="2" bgcolor="#E0EEE0"><div align="center"><?php echo $key?></div></td> </tr> </table>

</body> </html>

分析此例子

代码片段一

 代码如下 复制代码

$Page_size=10;

$result=mysql_query('select * from huazhuangpin');
$count = mysql_num_rows($result);
$page_count = ceil($count/$Page_size);

这代码是从数据库中先获取数据库总记录然后再利用$count/$Page_size(总记录除上每天多少条记录得出有多少页记录并且赋值给$page_coun

代码片段二

 代码如下 复制代码

$offset=$Page_size*($page-1);
$sql="select * from huazhuangpin limit $offset,$Page_size"; $result=mysql_query($sql);

这代码核心部份是$offset=$Page_size*($page-1);  这个是利用我们获取的当前页面-1然后判断总记录在多少条再在sql中实现从X,y条记录读取limit $offset,$Page_size 这样就实现了分页获取记录了

代码片段三

 代码如下 复制代码

if(empty($_GET['page'])||$_GET['page']<0){ $page=1; }else { $page=$_GET['page']; }

这段代码是获取page如果page为空就默认为第一页,否则就获取当前页面页码给$page变量以后面的程序作参考值处理。

关于重复数组的删除我们都介绍过N种方法了,今天这个例子有点不同就是 删除数组中相同的元素,只保留一个相同元素了,下面我们上例子。
 代码如下 复制代码

<?php
// 删除数组中相同元素,只保留一个相同元素
function formatArray($array)
{
sort($array);
$tem = ”;
$temarray = array();
$j = 0;
for($i=0;$i<count($array);$i++)
{
if($array[$i]!=$tem)
{
$temarray[$j] = $array[$i];
$j++;
}
$tem = $array[$i];
}
return $temarray;
}
//测试 调用函数
$array = array(‘aa’,'bb’,'aa’,3,4,5,5,5,5,’bc’);
$arr = formatArray($array);
print_r($arr);
?>

php实现文件下载有许多的方法最多的就是直接显示文件路径了然后点击下载即可,另一种是利用header函数再由filesize与fopen读取文件进行下载了,这个可以实现限速下载了,但是个人认为使用header限速下载大文件是非常的不理想的哦,下面我们来看个例子。

例子

 代码如下 复制代码

<?php
header("Content-Type; text/html; charset=utf-8");
class DownFile {
public static function File($_path,$file_name) {
//解决中文乱码问题
$_path=$_path.$file_name;
//判断文件是否存在
if (!file_exists($_path)) {
exit('文件不存在');
}
$_path=iconv('utf-8','gb2312',$_path);
$file_size=filesize($_path);
$fp=fopen($_path,'r');
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: $file_name");
header("Content-Disposition: attachment; filename=$file_name");
$buffer=1024;
$file_count=0;
while (!feof($fp) && ($file_size-$file_count>0)) {
$file_data=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_data;
}
fclose($fp);
}
}
//路径
$path='../';
//文件名
$file_name='filelist.php';
DownFile::File($path,$file_name);
?>

分析研究

使用header函数可以把像服务器端的脚本程序不需打包就可以进行下载了,像如php文件或html文件了,上面例子的核心语句是

 代码如下 复制代码

$_path=iconv('utf-8','gb2312',$_path);
$file_size=filesize($_path);
$fp=fopen($_path,'r');
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: $file_name");
header("Content-Disposition: attachment; filename=$file_name");
$buffer=1024;
$file_count=0;
while (!feof($fp) && ($file_size-$file_count>0)) {
$file_data=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_data;
}

下面三句,一个转换文件名编码这个防止中文乱码,第一个是获取文件大小,第三个是使用fopen读取文件

 代码如下 复制代码

$_path=iconv('utf-8','gb2312',$_path);
$file_size=filesize($_path);
$fp=fopen($_path,'r');

下面几行代码 是告诉浏览器我们要发送的文件是什么内容与文件名

 代码如下 复制代码

header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: $file_name");
header("Content-Disposition: attachment; filename=$file_name");


下面三行是告诉我们最大下载不能超过1MB第秒,并且循环一直下载,直到文件下载完毕即可

 代码如下 复制代码

$buffer=1024;
$file_count=0;
while (!feof($fp) && ($file_size-$file_count>0)) {
$file_data=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_data;

标签:[!--infotagslink--]

您可能感兴趣的文章: