通过具体程序来理解PHP里面的抽象类


Posted in PHP onJanuary 28, 2010

当然,可能存在多个根类,用来实现不同的功能. 在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用. 如果我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继承出来的子类合作.

抽象方法是就像子类中一般的方法的占位符(占个地方但不起作用),它与一般方法不同—没有任何代码. 如果类中存在一个或更多抽象方法, 那么这个类就成了抽象类. 你不能实例化抽象类. 你必须继承它们,然后实例化子类. 你也可以把抽象类看成是子类的一个模板.

如果你覆写所有的抽象方法, 子类就变成一个普通的类. 如果没有覆写所有方法, 子类仍是抽象的. 如果一个类中中包含有抽象方法(哪怕只有一个), 你必须声明这个类是抽象的, 在class关键字前加上abstract.

声明抽象方法的语法与声明一般方法不同. 抽象方法的没有像一般方法那样包含在大括号{}中的主体部份,并用分号;来结束.
在下面的程序文件中, 我们定义了一个含有getArea方法的类Shape. 但由于不知道形状不可能确定图形的面积,的确我们声明了getArea方法为抽象方法. 你不能实例化一个Shape对象,但你可以继承它或在一个表达式中使用它, 就像例6.13中那样.

如果你建立了一个只有抽象方法的类,你就定义了一个接口(interface). 为了说明这种情况, PHP中有interface 和implements关键字. 你可以用interface来代替抽象类, 用implements来代替extends来说明你的类定义或使用一个接口. 例如, 你可以写一个myClass implements myIterface. 这两种方法可以依个人偏爱来选择.

代码

/*注: 
两种方法即指: 
1. abstract class aaa{} (注意aaa中只有抽象方法,没有一般方法) 
class bbb extends aaa{} (在bbb中覆写aaa中的抽象方法) 
2. interface aaa{} 
class bbb implements aaa{} (在bbb中覆写aaa中的抽象方法) 
*/ 
<?php //abstract root class 抽象根类 
abstract class Shape 
{ 
abstract function getArea(); //定义一个抽象方法 
} 
//abstract child class 抽象子类 
abstract class Polygon extends Shape //多边形 
{ 
abstract function getNumberOfSides(); 
} 
//concrete class 实体类 三角形类 
class Triangle extends Polygon 
{ 
public $base; 
public $height; 
public function getArea() //覆写计算面积方法 
{ 
return(($this->base * $this->height)/2); 
} 
public function getNumberOfSides() //覆写边数统计方法 
{ 
return(3); 
} 
} 
//concrete class 实体类四边形 
class Rectangle extends Polygon 
{ 
public $width; 
public $height; 
public function getArea() 
{ 
return($this->width * $this->height); 
} 
public function getNumberOfSides() 
{ 
return(4); 
} 
} 
//concrete class 实体类 圆形 
class Circle extends Shape 
{ 
public $radius; 
public function getArea() 
{ 
return(pi() * $this->radius * $this->radius); 
} 
} 
//concrete root class 定义一个颜色类 
class Color 
{ 
public $name; 
} 
$myCollection = array(); //建立形状的集合,放入数组 
//make a rectangle 
$r = new Rectangle; 
$r->width = 5; 
$r->height = 7; 
$myCollection[] = $r; 
unset($r); 
//make a triangle 
$t = new Triangle; 
$t->base = 4; 
$t->height = 5; 
$myCollection[] = $t; 
unset($t); 
//make a circle 
$c = new Circle; 
$c->radius = 3; 
$myCollection[] = $c; 
unset($c); 
//make a color 
$c = new Color; 
$c->name = "blue"; 
$myCollection[] = $c; 
unset($c); 
foreach($myCollection as $s) 
{ 
if($s instanceof Shape) print("Area: ".$s->getArea()."<br>\n"); //如果$s是Shape类的实例 
if($s instanceof Polygon) print("Sides: ".$s->getNumberOfSides()."<br>\n"); 
if($s instanceof Color) print("Color:".$s->name."<br>\n"); 
print("<br>\n"); 
} 
?>

运行结果:
Area: 35
Sides: 4
Area: 10
Sides: 3
Area: 28.274333882308
Color:blue
PHP 相关文章推荐
PHP如何透过ODBC来存取数据库
Oct 09 PHP
PHP 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
CI框架的安全性分析
May 18 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
php app支付宝回调(异步通知)详解
Jul 25 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 PHP
PHP实现简单的计算器
Aug 28 PHP
认识并使用PHP超级全局变量
Jan 26 #PHP
php 静态变量与自定义常量的使用方法
Jan 26 #PHP
php学习之 认清变量的作用范围
Jan 26 #PHP
PHP 变量的定义方法
Jan 26 #PHP
php cout&amp;lt;&amp;lt;的一点看法
Jan 24 #PHP
php addslashes和mysql_real_escape_string
Jan 24 #PHP
PHPMailer 中文使用说明小结
Jan 22 #PHP
You might like
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
Python+微信接口实现运维报警
2016/08/27 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
python写程序统计词频的方法
2019/07/29 Python
python实现猜数字游戏
2020/03/25 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
python如何使用腾讯云发送短信
2020/09/17 Python
python3中for循环踩过的坑记录
2020/12/14 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
Shell如何接收变量输入
2016/08/06 面试题
财务会计专业毕业生自荐信
2013/10/02 职场文书
运动会解说词50字
2014/01/18 职场文书
2019年思想汇报
2019/06/20 职场文书
人生感悟经典句子
2019/08/20 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
Python学习开发之图形用户界面详解
2021/08/23 Python
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android