专栏首页决胜机器学习PHP面向对象核心(二)——继承、多态、接口

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),作者:linhxx

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP面向对象核心(三)——反射、异常处理

    PHP面向对象核心(三) (原创内容,转载请注明来源,谢谢) 五、反射 1、反射即PHP运行过程中,提取出关于类、方法、属性、参数等信息,包括 注释信息。动态获...

    用户1327360
  • 《Redis设计与实现》读书笔记(十二) ——Redis键的生存时间与过期时间

    《Redis设计与实现》读书笔记(十二) ——Redis键的生存时间与过期时间 (原创内容,转载请注明来源,谢谢) 1、设置方式 在redis客户端,可以通过e...

    用户1327360
  • 有趣的算法(十) ——归并排序思想解决大量用户数据清洗

    有趣的算法(十)——归并排序思想解决用户数据清洗 (原创内容,转载请注明来源,谢谢) 一、问题阐述 近期工作中接触到一个很有趣的算法,在此进行分享。 当前有...

    用户1327360
  • 用Python来写MapReduce之Wordcount

    虽然Hadoop是用Java编写的一个框架, 但是并不意味着他只能使用Java语言来操作, 在Hadoop-0.14.1版本后, Hadoop支持了Python...

    YingJoy_
  • 揭秘:ReWalk机器人外骨骼诞生背后的故事

    Argo公司在ReWalk机器人外骨骼获FDA批准个人在医院以外的地方使用后,准备赴美IPO。至此全球已有三家机器人外骨骼公司获得投资者的青睐。 机器人外骨骼R...

    机器人网
  • Spring Cloud Sleuth使用ELK收集&分析日志

    注意, logstash-logback-encoder 的版本务必和Logback兼容,否则会导致应用启动不起来,而且不会打印任何日志!可前往 https:/...

    用户1516716
  • 集合去重方法,自备

    听着music睡
  • display , visibility

    我不是费圆
  • 给你的博客文章加入”展开/收缩功能‘’

    Youngxj
  • PostgreSql 复杂的查询,我可怎么分析 (神奇的web site)

    永久了MYSQL 可能会忘记什么是复杂的查询,每种数据库有自己的特点,POSTGRESQL 是一个 OLAP + OLTP 兼得的数据库,所以postgresq...

    AustinDatabases

扫码关注云+社区

领取腾讯云代金券