PHP面向对象核心(二)——继承、多态、接口

PHP面向对象核心(二)

(原创内容,转载请注明来源,谢谢)

三、继承与多态

3.1 继承

1、继承是类级别的复用,关键词为extends;多态是方法级别的复用。

2、类的组合:一个类作为另一个类的属性;类的继承:子类继承父类的全部内容。

3、范围解析运算符(::)

当子类需要调用父类的方法或者属性时使用此运算符;

当调用类常量和静态方法时使用此符号调用。

4、决定采用组合还是继承,目标是低耦合,即使模块之间尽量独立。

继承扩展简单,但破坏封装,且紧耦合;组合缺点是代码量大。

5、当类不是设计用于继承的,可以加上final,避免被继承。

当方法不想被覆盖,也可以加上final,父类方法被子类覆盖。

属性没有final,只有类和方法可以定义为final。

3.2 多态

1、多态可以理解为同一对象在允许时的具体化。

2、重载不等于多态,重载是多态的一种表现形式。

3、多态的实现方式——通过PHP的get_class()方法

PHP执行结果如下:

PHP源码如下:

<?php
class plane{}
class car{}
class other{}
function muti($obj){
     $now_class= get_class($obj);
     if($now_class== 'plane'){
              echo$now_class.'的执行结果是:fly<br />';
     }elseif($now_class == 'car'){
              echo$now_class.'的执行结果是:drive<br />';
     }else{
              echo$now_class.'的执行结果是:error<br />';
     }
}
muti(new plane());
muti(new car());
muti(new other());

四、接口

1、接口可以视为类与类之间的协议,对于采用接口(implements)的类,都要实现接口内部定义的方法,否则会报fetal错误。

2、PHP接口的不足在于内部接口较少,且没有契约限制,即允许继承接口的类实现接口没有定义的方法。

3、Iterator迭代器接口,实现此接口的类可以采用foreach输出。该接口有五个方法,分别是:current、key、next、rewind、valid。

PHP的SPL中有一个类DirectoryIterator,该类实现了Iterator接口。

IteratorAggregate 接口替代实现所有的Iterator 方法。IteratorAggregate 只需要实现一个方法 getIterator(),即可实现输出结果。

4、traits

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制,可以认为是一种加强型接口。

优先级方面,从基类继承的成员会被trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。

例如:classB::functionName instance of classA,则定义A、B两个类中同名的方法functionName采用B定义的内容。

但是,对于属性,Trait 定义了一个属性后,类就不能定义同样名称的属性,否则会产生 fatal error。除非属性是兼容的(即同样的访问可见度、初始默认值)。

简单示例:

<?php
trait TraitA{
         public$a = 10;
    public function echoA{
    echo $this->a;
}
}
class ClassA{
    use TraitA;
}
$a = new ClassA();
$a->echoA();//输出 10

——written by linhxx 2017.06.20

相关阅读:PHP面向对象核心(一)——序列化与魔术方法

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

spring学习遇到的问题汇总

 1.spring注解路由方面的误解 我一直以为在web.xml中配置拦截*.action后,在注解路由的时候必须要xxxx.action。 刚才发现,访问的时...

3196
来自专栏Kotlin源码阅读

kotlin源码阅读——字符串

filename:String.kt/StringsJVM.kt/Arrays.kt/CharSequence.kt

2554
来自专栏java一日一条

Java 反射机制应用实践

Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利...

722
来自专栏小灰灰

SPI框架实现之旅三:实现说明

SPI框架实现之旅三:实现说明 前一篇 《SPI框架实现之旅二:整体设计》中,介绍了几个定义的接口,注解;叙述了实现流程;并简单的介绍了 SpiLoader中...

17310
来自专栏微信公众号:Java团长

Java集合框架综述

最近打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一...

763
来自专栏逸鹏说道

new and override

昨天有个网友问我继承里面的new和override关键词有啥区别,呃,我们来看个例子就知道了 new ==》隐藏父类同名方法 override==》覆盖 定义...

3298
来自专栏枕边书

Java高级特性之泛型

874
来自专栏木木玲

设计模式 ——— 代理模式

1294
来自专栏Android机动车

Dagger2系列——初识

经过一段时间的纠结和水深火热,终于渐渐领悟了Dagger2,在此分享一下学习心得,希望同样对Dagger2水深火热的你们有点帮助。

743
来自专栏有趣的django

8.python面向对象编程

基本概念 Class 类 一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法...

2827

扫码关注云+社区