20150112--抽象类+接口+重载+自动加载机制-01

image

 

回顾

面向对象:自动加载(__autoload),类常量访问(范围解析操做符),静态(属性和方法:self) php

设计模式:单例模式(三私一公),工厂模式 面试

面向对象三大特性:封装,继承和多态(PHP不支持) 设计模式

PHP继承:extends(对象继承:属性和非私有方法) this

PHP继承

方法重写

子类拥有与父类同名的方法。 设计

clip_image002

除了私有的属性和方法以外,系统一概都是去子类中查找属性和方法,可是若是对应的属性和方法是私有的,那么系统必定要去判断$this所表明的上下文(类环境),在哪一个类就访问哪一个类的私有属性和方法。 3d

重写的原则:被重写的方法的访问权限必定要比原来的方法的权限要大(Open)。 对象

clip_image004

PHP继承链

在php中不支持一个类继承自多个父类。 blog

在有些语言中 能够实现多继承:class A extends B,C(PHP中不行) 继承

clip_image006

PHP中能够经过继承链(链式继承)来实现子类继承多个“父类”。 接口

clip_image008

静态在继承中的使用

静态的东西属于类,类其实在结构有相似继承概念,因此静态的内容也能够遵循继承的传统去跨类使用。

clip_image010

parent关键字

若是子类中重写了父类的方法,那么父类的方法就再也不会被调用,可是有时候须要父类的方法也执行,就需用使用parent关键字:

在被重写的方法以内:parent::父类的同名方法()

clip_image012

特殊类

有时候不但愿本身写的类被别人继承,由于继承就有可能破坏类的结构。

Final类

final类又叫作最终类,指的是使用final 关键字修饰的类,不能够被其余类继承。

clip_image014

final关键字还能修饰方法,表示被修饰的方法不能被子类重写。

clip_image016

final类的意义:不能够继承,防止类结构被破坏

抽象类

有些类不可以被实例化,只能被继承。

抽象类是使用abstract关键字修饰的类。

clip_image018

抽象类只能被继承

clip_image020

abstract关键字能够用在方法上;表示当前方法是抽象方法,抽象方法不能有方法体(大括号)

clip_image022

抽象方法必须被子类实现:重写并添加方法体

clip_image024

实现抽象类的抽象方法

clip_image026

继承抽象方法:子类也必须是抽象类

clip_image028

一个拥有抽象方法的类必定是抽象类(必须显示的对类使用关键字abstract)

clip_image030

抽象类的意义:抽象类用于规范下面的子类里面所拥有的方法的名字

若是项目较大,有可能使用抽象类,若是项目很小或者说不须要那么多规范,就不怎么使用抽象类。

抽象类中能够拥有普通类中任何的类成员,可是不能使用私有的访问修饰限定符(private)

clip_image032

接口

接口分为不少种

应用型接口:一种能够容许外部使用的入口

数据型接口:用来规范外部去实现某些功能的方式(结构规范)

定义接口

语法:interface 接口名字{//接口体}

clip_image034

接口体

接口体也称之为接口成员,指的是在接口中能够定义的内容。

在接口中,只能有方法和常量,并且方法必须是抽象(不须要abstract关键字:没有方法体)的,并且只能public修饰。

clip_image036

接口不能被实例化,接口也不能被“继承”,接口只能被实现:implements

实现接口

实现接口值:用类去实现接口,必需要实现接口中的全部的抽象方法。

clip_image038

接口意义

与抽象类同样,用来规范底层的类的结构。比抽象类更加严格的规范结构。接口是一种纯粹用于规范的一种结构。

接口只有在团队比较大,分支比较多的状况下,用于规范整个团队,保证内部的不一样分支下的结构相同。

接口的特殊使用

接口能够多实现,一个类能够同时实现多个接口

class 类名 implements 接口1,接口2,…{}

clip_image040

接口能够继承接口:interface A extends B{} //B是接口

clip_image042

常见的面试题

1. 抽象类是否是类?

抽象应该理解为是类,可是不能被实例化的类。(用的是关键字class)

2. PHP是否支持多继承?如何模拟?

PHP不支持多继承,可是能够用链式继承来模拟实现多继承。

2. 接口是否是类?接口是否是抽象类?

接口不是类,接口是interface,而类是class;接口也不是抽象类

3. 接口能不能被继承?

接口只能被类实现,可是接口是能够被接口继承的。

类相关经常使用的方法

class_exists:判断类在内存中是否存在,用于在类的加载以前进行数据判断

clip_image044

interface_exists:判断接口是否存在

method_exists:判断方法是否存在,只要方法存在,跟方法全部的访问修饰限定符没有关系

clip_image046

get_class:获得对象类名

clip_image048

get_parent_class:获得父类名,获取当前对象对应的类的上级类的类名,若是上级也是继承自其它类,则获取不到。(只能获取父类名)

clip_image050