php面向对象4部曲继承详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php面向对象4部曲继承详解相关的知识,希望对你有一定的参考价值。

类的继承

简单理解:

某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息。

 技术分享

基本概念

  • 继承:一个类从另一个已有的类获得其特性,称为继承。
  • 派生:从一个已有的类产生一个新的类,称为派生。

继承和派生,其实只是从不同的方向(角度)来表述,本质上就是一个事情。

  • 父类/子类:已有类为父类,新建类为子类。父类也叫“基类”,子类也叫“派生类”
  • 单继承:一个类只能从一个上级类继承其特性信息。php和大多数面向对象的语言都是单继承模式。C++是多继承。
  • 扩展:在子类中再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了

访问(权限)修饰符

在类中的成员,通常都可以在前面加上以下3个修饰符:

public:公共的,共有的,公开的

protected:受保护的

private:私有的,

 

public公有的

用该修饰符修饰的成员,可以在任何位置使用(访问)。

访问(使用)是这样一个语法模式: 

对象->成员;

类名::成员;

访问位置分为3个:

1:某个类内部:自然是该类的某个方法中

2:某个类的具有继承关系的子(父)类的内部:是指其他类的某个方法中。

3,某个类的外部:一般就是独立的代码区(不在类中),类似我们之前的代码。

代码演示如下:

 技术分享

protected 受保护的

protected修饰的成员,可以在当前类或当前类的上下级具有继承关系的类中访问。

 技术分享

private私有的

private 修饰的成员,只能在其所在的类中访问。

 

技术分享

 

 

访问修饰限定符的总结:

 技术分享 

parent代表父类

对比:self代表本类(自己当前类)

parent通常用于在子类中调用父类的成员的时候使用,多数通常就是使用父类的静态类成员。

——因为parent代表的类,而非对象。

以下为parent关键字的2常见用法:

 

技术分享

 

 

构造方法析构方法在继承中的表现

  • 子类中没有定义构造方法时,会自动调用父类的构造方法。因此实例化子类时,需按照父类的构造方法的形式进行。

 技术分享

 

修改为:

 技术分享

 

 

  • 子类定义了自己的构造方法,则不会自动调用父类的构造方法,但可以手动调用:parent::__construct();

 技术分享

 

但通常,在子类,很多时候,在构造方法中,都应该(需要)去调用父类的构造方法以节省代码,增加可读性:

 

技术分享

 

 

  • 子类中没有定义析构方法时,会自动调用父类的析构方法。
  • 子类定义了自己的析构方法,则不会自动调用父类的析构方法,但可以手动调用:parent::__destruct()

重写override

重写又叫覆盖,就是将从父类继承下来的属性或方法重新定义”——就是从新写。

 技术分享

 

但注意:子类覆盖父类的方法,虽然可以去调用父类的同名方法去完成一定的工作,但不是必须的。也有可能父类的该方法所执行的结果并不适合子类,此时子类就去完全自己写了。

重写的基本要求:

访问控制权限:

下级的访问控制权限应该不低于上级的访问控制权限:

上级:public  下级:只能public

上级:protected  下级: protected, public

上级:private   下级:private  protected  public——实际此情况无意义。

私有的不能覆盖,而是完全当作自己全新的。

 

方法的参数形式:

应该跟父类的一致。

 技术分享

 

正确的做法:

 技术分享

 

更多参数也不对:

 技术分享

 

  • 私有属性和私有方法的重写问题:私有属性和方法都不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法。只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。
  • 构造方法的重写问题:构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松:重写的时候参数可以不一致。

 技术分享

 

 

最终类final class

通常,一个类,没有特别声明的话,则别人就可以随意拿过来使用并对之进行扩展”——继承。

但是:

如果某个类不希望对其进行扩展,则可以将其声明为最终类

形式:

final  class  类名{ 。。。。类定义。。。。}

最终方法final method

通常,一个方法,如果没有特别声明,则下级类就可以对其进行覆盖(重写)。

但是:

如果某个方法不希望被下级类覆盖,就可以对其生命为最终方法

形式:

final  function  方法名(){。。。。方法定义。。。。}

 

设计模式

什么叫设计模式

所谓设计模式,就是一些解决问题的常规做法,是一种认为较好的经验总结。面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式。

 

工厂模式

在实际应用中,我们总是需要去实例化很多很多的类——以得到对象。

则:

我们可以设计出一个工厂(其实就是类),该工厂的作用(任务)就是为人们生产各种对象。这种工厂通常只要指定类名,就可以据此获取一个该类的对象。

 技术分享

 

 

 

 

以上是关于php面向对象4部曲继承详解的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象详解:继承封装与多态

php面向对象特性三

PHP面向对象的特点

面向对象特征

PHP学习笔记之继承(面向对象三大特性之一)

php 面向对象之继承多态和静态方法