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,让编译器对此方法的调用进行优 ...
随机推荐
- 在最新的Power BI Desktop中使用报表主题功能
报表主题的工作原理 Power BI Desktop中,增加了万众期待的报表主题色功能(预览),如下图: 要使用这个功能,请先在官网下载并安装最新版的Power BI Desktop.安装成功后在&q ...
- MFC打开文件选择框和多选框,保存文件夹的选择,保存文件路径的选择
CString defaultDir = "C:\\"; //默认打开的文件路径 CString fileName = ""; //默认打开的文件名 CStri ...
- 关于JS获取某月最后一天
发现网上用js获取某月最后一个的方式大多比较复杂,上个简单的: new Date(2013,4).toJSON().substring(0,10) new Date(2013,4,0).toLocal ...
- IT资源关东煮第一期【来源于网络】
IT资源关东煮第一期[来源于网络] 地址:http://geek.csdn.net/news/detail/128222
- Processing-基础小坑-
x 坑A:) 新建一个"Walker"项目,Walker.pde,必须在Walker文件夹下... 刚开始以为如果一个文件需要引用另外一个文件中的类,只要把这两个文件放一个文件夹下 ...
- Codeforces 219C - Color Stripe - [DP]
题目链接:http://codeforces.com/problemset/problem/219/C 题意: 给你 $n$ 个方块排成水平一排,每个方块都涂上 $k$ 种颜色中的一种.要求对尽量少的 ...
- Abhyankar's Conjecture
http://www.math.purdue.edu/about/purview/spring95/conjecture.html A Layman's Perspective of Abhyanka ...
- [daily][grub2] grub2修改内核选项
以前, 我们就直接去修改 /boot/grub/grub.cfg 文件了. 其实这并不正确. 正确的做法是: 1. 修改 /etc/default/grub 文件. [root@dpdk ~]# c ...
- MiniHook研究
git hub 地址: https://github.com/RaMMicHaeL/minhook
- JAVA常用的异常处理情况
从编程到现在,遇见过很多次程序崩的情况,好多时候都不知道怎么去解决才好,一般性解决就是百度或者问别人,但是每一次百度解决的下一次还是会遇见同样的问题,也没有系统的整理梳理过相关的处理异常的知识,再一次 ...