PHP的类,abstract类,interface及关键字extends和implements
原文:https://blog.csdn.net/qq_19557947/article/details/77880757?locationNum=4&fps=1
PHP类
PHP类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了
abstract
用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
抽象方法是只有方法声明,而没有方法的实现内容。
抽象类不能被实例化,通常是将抽象方法做为子类方法重写使用的,且要把继承的抽象类里的方法都实现。
abstract class AbstractClass{
//定义抽象方法
abstract protected function getValue();
//普通方法
public function printOut(){
echo $this->getValue();
}
} class CommonClass extends AbstractClass{
protected function getValue(){
return "抽象方法的实现";
}
} $class1 = new CommonClass();
$class1->printOut();
extends
extends是继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法,
如果类被声明为final,则不能被继承。
implements
implements是实现多个接口,接口的方法一般为空,必须重写才能使用
interface
如果一个抽象类里的所有方法都是抽象方法,且没有声明变量,所有成员都是public权限,那么这种特殊的抽象类就叫 接口
interface即PHP接口,并用关键字implements来实现接口中方法,且必须完全实现。
例:
//定义接口
interface User{
function getDiscount();
function getUserType();
}
//VIP用户 接口实现
class VipUser implements User{
//VIP用户折扣系数
private $discount = 0.8;
function getDiscount(){
return $this->discount;
}
function getUserType(){
return 'VIP';
}
}
class Goods{
var $price =100;
var $vc;
//定义User接口类型参数,这时并不知道是什么用户
function run(User $vc){
$this->vc=$vc;
$discount = $this->vc->getDiscount();
$usertype = $this->vc->getUserType();
echo $usertype.'商品价格:'.$this->pirce*$discount;
}
}
$display = new Goods();
$display->run(new VipUser());
输出:VIP商品价格:80
该例子中,User接口中实现用户的折扣,而在VipUser类里面实现了具体的折扣系数,最后商品类Goods根据user接口来实现不同用户报价
实现多个接口
PHP也可以在继承一个类的时候同时实现多个接口
class 子类 extends 父类 implements 接口1,接口2,...
{
......
}
抽象类和接口的区别
接口是一个特殊的抽象类,也可以看作是一个模型的规范,接口与抽象类大致区别如下:
1,一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可
2,如果一个接口中定义的方法名改变了,那么所有市县次接口的子类需要同更新方法名,而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已
3,抽象类只能单继承,当一个子类需要实现的功能需要集成多个父类,就必须适用接口。
PHP的类,abstract类,interface及关键字extends和implements的更多相关文章
- java 类与类,类与接口 ,接口与接口关系
类: 生活中类是人们对客观事物不断认识而产生的抽象概念,而对象则是现实生活中的一个个实体 面向对象程序设计中,对象是程序的基本单位,相似的对象像变量和类型的关系一样归并到一类,所以,并不先具体地定义对 ...
- java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0
java 继承使用关键字extends 继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...
- Abstract和Virtual和interface , 派生类中重写 override / new关键字
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...
- Interface与abstract类的区别
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...
- Java标识符和关键字(static,final,abstract,interface)
本文的主要内容如下 1.标识符合关键字 2.Java中的关键字 3.static关键 字 4.static方法 5.静态代码块 6.static修饰符综述 7.final关键字 8.final修饰 ...
- abstract和interface关键字介绍
一.abstract关键字介绍 abstract可以修饰方法.类.使用abstract修饰的方法和类分别叫做抽象方法和抽象类. 1.抽象方法 抽象方法的定义:指可以通过abstract关键字声明的方法 ...
- 事实证明,abstract类除了不能用new实例化和类没什么区别
abstract类是抽象类,不能够实例化,大家都知道,abstract类往往和接口interface一块儿使用,针对接口中一些公共的方法进行实现,然后实体类去继承抽象类和接口.虽然abstract类不 ...
- final方法,abstract方法和abstract类,native方法
final方法 1.为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(override),可以使用final方法. 2.为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优 ...
随机推荐
- DevExpress MemoEdit定位到末尾
1: /// <summary> 2: /// 追加文本到MemoEdit中 3: /// </summary> 4: /// <param name="mem ...
- 【python】用python生成pdf文件
转自:https://www.davidfischer.name/2015/08/generating-pdfs-with-and-without-python/ from reportlab.pla ...
- redmine增加文本输入框默认格式
需求:击一个按钮,在文本输入区域自动生成如下图的内容: 1. 详细描述: 2. 详细步骤: 3. 期望结果: 4. 实际结果: 实现过程: 1 打开文件\apps\redmine\public\jav ...
- CentOS安装中文支持包
修改配置文件 LANG="zh_CN.UTF-8" 改为中文字符集 然后在查看更改后的系统语言变量 [root@5c46832b5c01 ~]# locale locale: Ca ...
- 大疆OSMO口袋云台相机惊艳上市!友商该如何是好。。。
2018.11.29 晚上更新: 下午看了大疆新出的口袋云台摄像机,感觉棒极了,于是我立刻去了京东下单预订了.目前是可以免息分期6个月就可以搞定了.‘ 大家敬请期待我的评测视频吧. ======== ...
- gulp安装及使用流程
1. 安装nodejs 去 https://nodejs.org/en/下载安装文件安装即可. 安装完成后,在终端输入node -v回车打印出nodejs的版本号,说明nodejs安装成功. 在终端输 ...
- Windows环境下安装Linux
怎样实现在现有的Windows系统上安装Linux,实现双系统启动
- 快速排序中的partition.
经典快速排序中的partition, 将最后一个元素作为划分点. 维护两个区域. <= x 的, >x 的区域. 划分过程中还有个待定的区域. [L,less] 区域小于x, [less+ ...
- [No0000144]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈1/4
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...
- [No0000133]c# ERROR:“.”(十六进制值 0x00)是无效的字符
December 24, 2013 c# exception “.”(十六进制值 0x00)是无效的字符. 解决方法:常见于socket方式连接(包括HTTP方式)等.报文交互时候,对方会在字符串后面 ...