面向對象:自動加載(__autoload),類常量訪問(範圍解析操做符),靜態(屬性和方法:self) php
設計模式:單例模式(三私一公),工廠模式 面試
面向對象三大特性:封裝,繼承和多態(PHP不支持) 設計模式
PHP繼承:extends(對象繼承:屬性和非私有方法) this
子類擁有與父類同名的方法。 設計
除了私有的屬性和方法以外,系統一概都是去子類中查找屬性和方法,可是若是對應的屬性和方法是私有的,那麼系統必定要去判斷$this所表明的上下文(類環境),在哪一個類就訪問哪一個類的私有屬性和方法。 3d
重寫的原則:被重寫的方法的訪問權限必定要比原來的方法的權限要大(Open)。 對象
在php中不支持一個類繼承自多個父類。 blog
在有些語言中 能夠實現多繼承:class A extends B,C(PHP中不行) 繼承
PHP中能夠經過繼承鏈(鏈式繼承)來實現子類繼承多個「父類」。 接口
靜態的東西屬於類,類其實在結構有相似繼承概念,因此靜態的內容也能夠遵循繼承的傳統去跨類使用。
若是子類中重寫了父類的方法,那麼父類的方法就再也不會被調用,可是有時候須要父類的方法也執行,就需用使用parent關鍵字:
在被重寫的方法以內:parent::父類的同名方法()
有時候不但願本身寫的類被別人繼承,由於繼承就有可能破壞類的結構。
final類又叫作最終類,指的是使用final 關鍵字修飾的類,不能夠被其餘類繼承。
final關鍵字還能修飾方法,表示被修飾的方法不能被子類重寫。
final類的意義:不能夠繼承,防止類結構被破壞
有些類不可以被實例化,只能被繼承。
抽象類是使用abstract關鍵字修飾的類。
抽象類只能被繼承
abstract關鍵字能夠用在方法上;表示當前方法是抽象方法,抽象方法不能有方法體(大括號)
抽象方法必須被子類實現:重寫並添加方法體
實現抽象類的抽象方法
繼承抽象方法:子類也必須是抽象類
一個擁有抽象方法的類必定是抽象類(必須顯示的對類使用關鍵字abstract)
抽象類的意義:抽象類用於規範下面的子類裏面所擁有的方法的名字
若是項目較大,有可能使用抽象類,若是項目很小或者說不須要那麼多規範,就不怎麼使用抽象類。
抽象類中能夠擁有普通類中任何的類成員,可是不能使用私有的訪問修飾限定符(private)
接口分爲不少種
應用型接口:一種能夠容許外部使用的入口
數據型接口:用來規範外部去實現某些功能的方式(結構規範)
語法:interface 接口名字{//接口體}
接口體也稱之爲接口成員,指的是在接口中能夠定義的內容。
在接口中,只能有方法和常量,並且方法必須是抽象(不須要abstract關鍵字:沒有方法體)的,並且只能public修飾。
接口不能被實例化,接口也不能被「繼承」,接口只能被實現:implements
實現接口值:用類去實現接口,必需要實現接口中的全部的抽象方法。
與抽象類同樣,用來規範底層的類的結構。比抽象類更加嚴格的規範結構。接口是一種純粹用於規範的一種結構。
接口只有在團隊比較大,分支比較多的狀況下,用於規範整個團隊,保證內部的不一樣分支下的結構相同。
接口能夠多實現,一個類能夠同時實現多個接口
class 類名 implements 接口1,接口2,…{}
接口能夠繼承接口:interface A extends B{} //B是接口
常見的面試題
1. 抽象類是否是類?
抽象應該理解爲是類,可是不能被實例化的類。(用的是關鍵字class)
2. PHP是否支持多繼承?如何模擬?
PHP不支持多繼承,可是能夠用鏈式繼承來模擬實現多繼承。
2. 接口是否是類?接口是否是抽象類?
接口不是類,接口是interface,而類是class;接口也不是抽象類
3. 接口能不能被繼承?
接口只能被類實現,可是接口是能夠被接口繼承的。
class_exists:判斷類在內存中是否存在,用於在類的加載以前進行數據判斷
interface_exists:判斷接口是否存在
method_exists:判斷方法是否存在,只要方法存在,跟方法全部的訪問修飾限定符沒有關係
get_class:獲得對象類名
get_parent_class:獲得父類名,獲取當前對象對應的類的上級類的類名,若是上級也是繼承自其它類,則獲取不到。(只能獲取父類名)