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 条评论
登录 后参与评论

相关文章

来自专栏java工会

Java基础第二阶段知识点,招初级java的面试官都在问这些

1504
来自专栏程序生活

Python itertools的使用简介无限迭代器chain方法

用*放在一个可迭代对象前面可以将对象拆分成多个单元素,比如first=[['1','2','3','4','4'],['2','4','2']],如果把*放在f...

691
来自专栏JavaEdge

青铜到王者 ,快速提升你 Go语言的段位! "狗"语言实战(二)- 基础语法1 变量定义

1304
来自专栏C/C++基础

CC++变参函数

C语言中,有时需要变参函数来完成特殊的功能,比如C标准库函数printf()和scanf()。C中提供了省略符“…”能够帮主programmer完成变参函数的书...

711
来自专栏java 成神之路

JAVA对象在JVM中内存分配

33912
来自专栏九彩拼盘的叨叨叨

JavaScript 字符串练习题

如果对字符串的 API 不是很熟悉,可查阅 W3School JavaScript String API。

781
来自专栏Golang语言社区

[基础篇]Go语言变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。 Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。 声...

3647
来自专栏抠抠空间

集合 (set) 的增删改查及 copy()方法

简介: 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点: 1、...

28411
来自专栏用户2442861的专栏

Java基础之String中equals,声明方式,等大总结

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 

722
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(一)——作用域链内存模型

几个概念 在开始之前,先了解几个概念。 1.1. 作用域 作用域是指当前正在执行的代码能够访问到变量的范围; 每个函数都有各自的作用域,存储函数所有的局部变量...

4438

扫码关注云+社区