14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式相关的知识,希望对你有一定的参考价值。
类的继承
简单理解:
某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息。
基本概念
继承:一个类从另一个已有的类获得其特性,称为继承。
派生:从一个已有的类产生一个新的类,称为派生。
继承和派生,其实只是从不同的方向(角度)来表述,本质上就是一个事情。
父类/子类:已有类为父类,新建类为子类。父类也叫“基类”,子类也叫“派生类”
单继承:一个类只能从一个上级类继承其特性信息。php和大多数面向对象的语言都是单继承模式。C++是多继承。
扩展:在子类中再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了
访问(权限)修饰符
在类中的成员,通常都可以在前面加上以下3个修饰符:
public:公共的,共有的,公开的
protected:受保护的
private:私有的,
public公有的
用该修饰符修饰的成员,可以在“任何位置”使用(访问)。
访问(使用)是这样一个语法模式:
对象->成员;
类名::成员;
访问位置分为3个:
1:某个类内部:自然是该类的某个方法中
2:某个类的具有继承关系的子(父)类的内部:是指其他类的某个方法中。
3,某个类的外部:一般就是独立的代码区(不在类中),类似我们之前的代码。
代码演示如下:
类中只允许定义属性与方法,不允许出现echo 这样的使用。
子类可以在方法中直接访问父类的public 属性
父类也可以访问子类的属性
protected 受保护的
protected修饰的成员,可以在当前类或当前类的上下级具有继承关系的类中访问。
private私有的
private 修饰的成员,只能在其所在的类中访问。
parent代表父类
对比:self代表“本类”(自己当前类)
parent通常用于在子类中调用父类的成员的时候使用,多数通常就是使用父类的“静态类”成员。
——因为parent代表的类,而非对象。
以下为parent关键字的2常见用法:
当前的演示,用self,$this效果一样
构造方法析构方法在继承中的表现
子类中没有定义构造方法时,会自动调用父类的构造方法。因此实例化子类时,需按照父类的构造方法的形式进行。
修改为:
子类定义了自己的构造方法,则不会自动调用父类的构造方法,但可以手动调用:parent::__construct();
但通常,在子类,很多时候,在构造方法中,都应该(需要)去调用父类的构造方法以节省代码,增加可读性:
重写override
重写又叫覆盖,就是将从父类继承下来的属性或方法重新“定义”——就是从新写。
但注意:子类覆盖父类的方法,虽然可以去调用父类的同名方法去完成一定的工作,但不是必须的。也有可能父类的该方法所执行的结果并不适合子类,此时子类就去完全自己写了。
重写的基本要求:
访问控制权限:
下级的访问控制权限应该不低于上级的访问控制权限:
上级:public 下级:只能public
上级:protected 下级: protected, public
上级:private 下级:private protected public——实际此情况无意义。
私有的不能覆盖,而是完全当作自己全新的。
方法的参数形式:
应该跟父类的一致。
正确的做法:
更多参数也不对:
私有属性和私有方法的重写问题:私有属性和方法都不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法。只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。
构造方法的重写问题:构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松:重写的时候参数可以不一致。
最终类final class:
通常,一个类,没有特别声明的话,则“别人”就可以随意拿过来使用并对之进行“扩展”——继承。
但是:
如果某个类不希望对其进行扩展,则可以将其声明为“最终类”。
形式:
final class 类名{ 。。。。类定义。。。。}
最终方法final method
通常,一个方法,如果没有特别声明,则下级类就可以对其进行“覆盖”(重写)。
但是:
如果某个方法不希望被下级类覆盖,就可以对其生命为“最终方法”。
形式:
final function 方法名(){。。。。方法定义。。。。}
设计模式
什么叫设计模式
所谓设计模式,就是一些解决问题的“常规做法”,是一种认为较好的经验总结。面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式。
工厂模式
在实际应用中,我们总是需要去实例化很多很多的类——以得到对象。
则:
我们可以设计出一个“工厂”(其实就是类),该工厂的作用(任务)就是为人们“生产”各种对象。这种工厂通常只要指定类名,就可以据此获取一个该类的对象。
复习点:
类的继承
基本概念:
继承:从上级类获取其特性信息(属性和方法)的过程。B<<==A,B继承自A
派生:A==>>B,从A派生出新的类B,B具有A的“几乎所有特性”,并可以具有自己的特性。
父类/子类,基类/派生类,上级类,下级类。
单继承:php中,类的继承模式只能是从一个父类继承。java,c#也都如此。
扩展:B从A继承了一些特性,并额外又加上了自己的一些特性,这种现象就可以称为扩展。
访问(权限)修饰符
在成员(属性/方法/常量)前面,可以加上访问修饰符:public, protected, private
所谓访问,就是类似这样的语法形式:
对象->属性/方法;
类::属性/方法;
访问的位置(范围)区别:
A一个类的内部(肯定是方法内)
B一个类的继承关系类的内部(也是方法内)
C一个类的外部。
public公有的:
protected 受保护的
private私有的
注意:
1,对于方法,如果省略访问修饰符,默认按public算
2,对于普通属性,不能省略,但var代表public
3,对于静态属性,可以省略,省略按public算
4,对于常量,默认都是public
可以在子类中使用它,以此代表父类去访问父类中的成员。
parent::属性,表示获取父类的该属性。
parent::方法():表示调用父类的该方法。此时就可能会出现一个情形:
该父类方法中,可能会用到$this关键字,表示“当前对象”,但实际上此时表示的当前对象,并非是父类的对象,而是调用该方法的子类的对象。
此用法通常用于子类覆盖了父类的方法但又需要使用父类的同名方法的时候。
如果没有定义,则他们都会自动调用父类的同名方法。
如果定义了,则就不会自动调用了,但可以在其中“手动调用”,类似这个模式:
parent::__constuct(...)
parent::__destruct()
子类定义跟父类同名的属性或方法,就是重写。
1,访问权限修饰不能低于父类(必须同样级别或更开放)
2,对于方法,其形参必须跟父类一样。
最终类final class:不能(不允许)继承的类
final class A{....}
最终方法final method:不能(不允许)覆盖的方法
finale function f1(){....}
设计模式就是应用中面对某种特定情形的问题而设计出来的某种常见的有效的解决办法,是经验的总结。
工厂模式:
就是设计来专门“生产”类的对象的一种结构模式。
设计模式
工厂模式:
本文出自 “魂斗罗” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1759611
以上是关于14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式的主要内容,如果未能解决你的问题,请参考以下文章