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 相关文章推荐
linux php mysql数据库备份实现代码
Mar 10 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
Symfony2学习笔记之系统路由详解
Mar 17 PHP
示例详解Laravel的注册重构
Aug 14 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
PHP Include文件实例讲解
Feb 15 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
浅谈php常用的7大框架的优缺点
Jul 20 PHP
基于PHP实现发微博动态代码实例
Dec 11 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/11/07 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
python字符串,数值计算
2016/10/05 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Django 实现图片上传和下载功能
2020/12/31 Python
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
企业宣传方案
2014/03/04 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
教育读书笔记
2015/07/02 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python