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 IP及IP段进行访问限制的代码
Dec 17 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
php学习笔记 [预定义数组(超全局数组)]
Jun 09 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
PHP编程风格规范分享
Jan 15 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 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多个字符串替换成同一个的解决方法
2013/06/18 PHP
php四种基础算法代码实例
2013/10/29 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
Python实现结构体代码实例
2020/02/10 Python
win10下python3.8的PIL库安装过程
2020/06/08 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
报纸媒体创意广告词
2014/03/17 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
七年级上册生物的课件
2019/08/07 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python