<基础> PHP 进阶之 抽象类(abstract)、接口(interface)、Trait(特征)
抽象类
PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。
- 抽象方法只能在抽象类中,抽象类中可以包含非抽象方法
- 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现
- 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
抽象方法给我们提供了一个很好的保护父类的方法
class Fruit {
private $color; public function eat() {
//chew
} public function setColor($c) {
$this->color = $c;
}
} class Apple extends Fruit {
public function eat() {
//chew until core
}
} class Orange extends Fruit {
public function eat() {
//peel
//chew
}
}
上面定义了一个`水果父类` ,同时定义了两个子类`Apple`,`Orange`,此时
$apple = new Apple();
$apple->eat(); //实例化Apple类,调用eat方法,这没毛病 $fruit = new Fruit();
$fruit->eat(); //如果实例化Friut类,调用eat方法就有点奇怪了,What does that taste like???
抽象方法完美的解决了这个问题
abstract class Fruit {
private $color; abstract public function eat(); public function setColor($c) {
$this->color = $c;
}
}
因此,如果我们需要一个类的子类都实现同一个方法,每个方法的实现方法都不同,此时可以使用抽象方法
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
- 接口中只能定义方法名(含参数),不能有方法体
- 接口中定义的所有方法都必须是公有 (public)
- 要实现一个接口,使用 implements 操作符,类中必须实现接口中定义的所有方法
- 设计接口时如果不确定方法参数个数,可以使用 ...$argumens 可变参数代替,或者直接为空,子类中通过传入可变参数或者通过 func_get_args 获取
- 一个类可以同时实现多个接口,实现多个接口时,接口中的方法不能有重名
- 接口也可以继承,通过使用 extends 操作符
- 接口中也可以定义常量
通过接口我们可以很好的降低代码的耦合性
例如:
我有一个数据库,我想写一个类去访问我的数据库,所以我定义了一个接口
interface Database {
function listOrders():array; //要求次方法返回的数组
function addOrder(array $arr); //要求次方法参数类型为数组
function removeOrder();
...
}
现在我们使用MYSQL数据库,所以我写了一个mysql的类
class MySqlDatabase implements Database {
function listOrders() :array{...
}
过了一段时间,我们又想改成Oracle数据库,我们又写了一个oracle数据库类去实现接口
class OracleDatabase implements Database {
public function listOrders() :array{...
}
因为我们使用了接口,所有的方法(参数、返回值)都一致,我们只需要修改一行代码即可完成切换
$database = new OracleDatabase();
Trait
从PHP的5.4.0版本开始,PHP提供了一种全新的代码复用的概念,那就是Trait。Trait其字面意思是”特性”、”特点”,我们可以理解为,使用Trait关键字,可以为PHP中的类添加新的特性。
熟悉面向对象的都知道,软件开发中常用的代码复用有继承和多态两种方式。在PHP中,只能实现单继承。而Trait则避免了这点。下面通过简单的额例子来进行对比说明。
trait ezcReflectionReturnInfo {
function getReturnType() { /**/ }
function getReturnDescription() { /**/ }
} class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
} class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
声明一个trait 直接使用 trait 关键字 + 类名即可 , 与声明一个类相似
使用trait 使用关键字 use + 类名
注意:从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
<基础> PHP 进阶之 抽象类(abstract)、接口(interface)、Trait(特征)的更多相关文章
- Java基础系列4:抽象类与接口的前世今生
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...
- java基础知识回顾之抽象类和接口的区别
/* 抽象类和接口的异同点: 相同点: 都是不断向上抽取而来的. 不同点: 1,抽象类需要被继承,而且只能单继承. 接口需要被实现,而且可以多实现. 2,抽象类中可以定义抽象方法和非抽象方法,子类继承 ...
- 夯实Java基础(十)——抽象类和接口
转载自:http://cmsblogs.com/ 该博主的网站上干货非常!非常!非常多(说三遍),强烈推荐大家前去学习. 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法 抽象类与接口是 ...
- Java基础学习笔记(三) - 抽象类和接口
一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...
- 《Java基础知识》Java抽象类,接口的概念和使用
1.抽象类 在自上而下的继承层次结构中,位于上层的类更具有通用性,甚至可能更加抽象.从某种角度看,祖先类更加通用,它只包含一些最基本的成员,人们只将它作为派生其他类的基类,而不会用来创建对象.甚至,你 ...
- 虚方法(virtual)\抽象方法(abstract)\接口(interface)的区别
转自:https://www.cnblogs.com/fantaohaoyou/p/9402657.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽 ...
- java-继承进阶_抽象类_接口
概要图 一, 继承的进阶 1.1,成员变量 重点明确原理. 特殊情况: 子父类中定义了一模一样的成员变量. 都存在于子类对象中. 如何在子类中直接访问同名的父类中的变量呢? 通过关键字 super来完 ...
- Java基础(四)——抽象类和接口
一.抽象类 1.介绍 使用关键字 abstract 定义抽象类. abstract定义抽象方法,只有声明,不用实现. 包含抽象方法的类必须定义为抽象类. 抽象类中可以有普通方法,也可以有抽象方法. 抽 ...
- Java基础-抽象类和接口
抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...
随机推荐
- TCP/IP学习20180625-DNS
1 DNS:domain name system域名系統把域名,轉換成IP2 最開始是一個hosts.txt,後來是數據庫,最後是分佈式數據庫3 每個名字服務器存儲一部分名字.如果有不知道的名字,就轉 ...
- requests 请求几个接口 出现’您的账户在其它设备使用过,为保障安全,需重新登入才能在本设备使用‘
因为接口和接口直接有个字段是关联的 在登陆请求后,后台响应了个token,下面的请求 ,请求头要带上这个token 才认为是登陆后 的操作
- seo优化之域名泛解析优缺点分析
原文地址:http://www.phpddt.com/web/analysis-of-domain-name.html 自己也算半个SEOER,虽然没从事过优化工作,由于自己很感兴趣,每天还是会去看很 ...
- etcd 命令行(转)
原文 https://www.cnblogs.com/breg/p/5756558.html 比较重要的配置 -name 节点名称,默认是UUID-data-dir 保存日志和快照的目录,默认为当前工 ...
- 几个简单常用的jQuery实例
一.点赞效果: 1.1 效果: 1.2 代码: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Jmeter(十七)Logic Controllers 之 Interleave Controller
Interleave Controller----交错控制器,对于交错控制器官方文档解释的很清楚,上例子: 可以看到运行一次 Interleave Controller下的Sampler,运行一次 I ...
- [UE4]多播(广播)
只有服务器才有权限做广播,所以要判断确保是服务器端才做广播,有以下几种方法: 一.使用“Switch Has Authority”判断是否在服务器端 因为character一定是在服务器端创建出来的, ...
- MySql 索引优化实例
查询语句 SELECT customer_id,title,content FROM `product_comment` WHERE audit_status=1 AND product_id=199 ...
- CentOS之Shell基础
Linux默认的shell版本是bash. 我们所敲的命令都是有记录的:被保存在.bash_history文件中.只有当用户正常突出shell时,命令才会保存至.bash_history中. !!:连 ...
- CentOS7 设置集群时间同步
1. 安装ntp时间同步工具 yum -y install ntp ntpdate #安装ntpdate时间同步工具 ntpdate cn.pool.ntp.org #设置时间同步 hwclock - ...