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中cookies使用指南
Mar 16 PHP
php 注释规范
Mar 29 PHP
php中的常用魔术方法总结
Aug 02 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
Mar 17 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 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中取得URL的根域名的代码
2011/03/23 PHP
php+mysql实现无限级分类
2015/11/11 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
laravel学习教程之关联模型
2016/07/30 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
解决Python requests 报错方法集锦
2017/03/19 Python
对Django外键关系的描述
2019/07/26 Python
Python连接mysql方法及常用参数
2020/09/01 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
Python实现京东抢秒杀功能
2021/01/25 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
新郎婚宴答谢词
2014/01/19 职场文书
爱心活动计划书
2014/04/26 职场文书
欢迎横幅标语
2014/06/17 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书