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

相關文章
相關標籤/搜索