PHP面向对象的进阶学习(抽像类、接口、final、类常量)


Posted in PHP onMay 07, 2012

一、抽像类(abstract)
在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性
语法结构:

abstract class 类名{ 
属性 $name; 
方法(){} //方法也可以为abstract 修饰符 function 方法名(){} 
}

例:
abstract class animal{ 
public $name; 
public $age; 
//抽象方法不能有方法体,主要是为了让子类去实现; 
abstract public function cry(); 
//抽象类中可以包含抽象方法,同时也可以包含实例类方法 
public function getname(){ 
echo $this->name; 
} 
} 
class Cat{ 
public function cry(){ 
echo 'ok'; 
} 
}

理解:动物类,实际上是一个抽象的概念,它规定了一些动物有些哪共同的属性和行为,但实际上它自己并没收有那些属性和行为。再比如:交通工具类,植物类等等

注意:
1、如果一个类用了abstract来修饰,则该类就是一个抽象类,如果一个方法被abstract修饰,那么该方法就是一个抽象方法,抽象方法不能有方法体=> abstract function cry(); 连{}也不可以有
2、抽象类一定不能被实例化,抽象类可以没有抽象方法,但是如果一个类包含了任意一个抽象方法,这个类一定要声明为abstract类;
3、如果一个类继承了另一个抽象类,则该子类必须实现抽象类中所有的抽象方法(除非它自己也声明为抽象类);

二、接口(interface)
接口就是将一些没有实现的方法,封装在一起,到某个类要用的时候,再根据具体情况把这些方法写出来;
语法结构
interface 接口名{
//属性、方法
//接口中的方法都不能有方法体;
}
如何实现接口
class 类名 implements 接口名{

}
理解:接口就是更加抽象的抽象类,抽象类里的方法可以有方法体,但是接口中的方法必须没有方法体。接口实现了程序设计的多态和高内聚、低偶合的设计思想;

例:

//接口是定义规范、属性的,一般以小写的i开头; 
interface iUsb{ 
public function start(); 
public function stop(); 
} 
//编写相机类,让它去实现接口 
//当一个类实现了某个接口,那么该类就必须实现接口的所有方法 
class Camera implements iUsb{ 
public function start(){ 
echo 'Camera Start Work'; 
} 
public function stop(){ 
echo 'Camera Stop Work'; 
} 
} 
//编写一个手机类 
class Phone implements iUsb{ 
public function start(){ 
echo 'Phone Satrt Work'; 
} 
public function stop(){ 
echo 'Phone Stop Work'; 
} 
} 
$c=new Camera(); 
$c->start(); 
$p=new Phone(); 
$p->start();

什么时候使用接口:
1、定下规范,让其他程序员来实现
2、当多个平级的类,都需要去实现某个功能,但是实现的方式不一样;

小结:
1、接口不能被实例化,接口中所有的方法都不能有主体;
2、一个类可以实现多个接口,以逗号(,)分隔 class demo implements if1,if2,if3{}
3、接口中可以有属性,但必须是常量,常量不可以有修饰符(默认是public修饰符)
如:interface iUsb{
const A=90;
}
echo iUsb::A;
4、接口中的方法都必须是public的,默认是public;
5、一个接口不能继承其他的类,但是可以继承其它的接口,一个接口可以继承多个其它接口
如:interface 接口名 extends if1,if2{}
6、一个类可以在继承父类的同时实现其它接口
如:class test extends testbase implements test1,test2{}

实现接口VS继承类
php的继承是单一继承,也就是一个类只能继承一个父类,这样对子类功能的扩展有一定的影响。实现接口可以看做是对继承类的一个补充。继承是层级的关系,不太灵活,而实现接口是平级的关系,实现接口可以在不打破继承关系的前提下,对某个功能扩展,非常灵活。

三、Final

1、如果我们希望某个类不被其它的类继承(比如为了安全原因等。。),那么可以考虑使用final
语法:
final class A{}
2、如果我们希望某个方法,不被子类重写,可以考虑使用final来修饰,final修饰的方法还是可以继承的,因为方法的继承权取决于public的修饰
如:

class A{ 
final public function getrate($salary){ 
return $salary*0.08; 
} 
} 
class B extens A{ 
//这里父类的getrate方法使用了final,所以这里无法再重写getrate 
//public function getrate($salary){ 
// return $salary*0.01; 
//} 
}

3、final不能用来修饰属性

四、类常量(const)

在某些情况下,可能有这样的需求:当不希望一个成员变量被修改,希望该变量的值是固定不变的,这时可以使用const常量(常量名应该全用大写,并且不带$符号,常量不可以加修饰符)
语法:
const 常量名=常量值; //必须赋初值,因为常量是不能修改的
调用:
类名::常量名[本类内部可用self::常量名] 或者 接口名::常量名 //接口中只能使用常量,不能使用变量

如:

class A{ 
const TAX_RATE=0.08; 
function paytax($salary){ 
return $salary*self::TAX_RATE; 
} 
} 
$a=new A(); 
echo $a->paytax(100);

注:
1、常量可以被子类继承
2、常量是属于某个类的,而不属于某个对象
PHP 相关文章推荐
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
百度站点地图(百度sitemap)生成方法分享
Jan 09 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
php fread读取文件注意事项
Sep 24 PHP
PHP基于curl后台远程登录正方教务系统的方法
Oct 14 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
PHP中echo与print区别点整理
Mar 09 PHP
PHP file_exists问题杂谈
May 07 #PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 #PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 #PHP
php截取后台登陆密码的代码
May 05 #PHP
php在线代理转向代码
May 05 #PHP
超小PHP小马小结(方便查找后门的朋友)
May 05 #PHP
apache mysql php 源码编译使用方法
May 03 #PHP
You might like
php实现的简单数据库操作Model类
2016/11/16 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
jQuery 方法大全方便学习参考
2010/02/25 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
js中的reduce()函数讲解
2019/01/18 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python脚本实现格式化css文件
2015/04/08 Python
python机器学习之神经网络实现
2018/10/13 Python
Python基础之文件读取的讲解
2019/02/16 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
html5与css3小应用
2013/04/03 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
中医药大学毕业生自荐信
2013/11/08 职场文书
喝酒检查书范文
2014/02/23 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
优秀大学生自荐信
2015/03/26 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis
python可视化大屏库big_screen示例详解
2021/11/23 Python
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android