OOP
一.概述(object oriented programming面向?qū)ο缶幊?
--PHP是混合類(lèi)型的語(yǔ)言
面向過(guò)程
--以事件為解決問(wèn)題的中心
--解決的代碼封裝為自定義函數(shù)
--會(huì)在解決問(wèn)題的過(guò)程當(dāng)中逐步調(diào)用自定義函數(shù)
面向?qū)ο?br>
--以功能為中心,注重的是對(duì)象.只有面向?qū)ο缶幊滩攀菑?fù)合人類(lèi)思維邏輯的編程思想.
面向?qū)ο髢?yōu)點(diǎn):一次封裝,多次調(diào)用 提高工作效率,減輕代碼重復(fù)操作
面向?qū)ο蟮奶卣?br>
封裝:把功能相似的函數(shù),放在一個(gè)類(lèi)里 原則:高內(nèi)聚,低耦合
繼承:繼承父類(lèi)的屬性和方法
多態(tài):有繼承關(guān)系的類(lèi)對(duì)象,對(duì)于相同的成員方法調(diào)用,產(chǎn)生不同的結(jié)果.(同名異式)
面向?qū)ο蟮淖谥?
計(jì)算機(jī)程序是由單個(gè)的可以起到子程序作用的單元或者對(duì)象組合而成,這些單元或者對(duì)象為了實(shí)現(xiàn)整體運(yùn)算,他們可以接受信息,發(fā)送信息和對(duì)信息進(jìn)行計(jì)算.
對(duì)象:
世間萬(wàn)物皆為對(duì)象.
對(duì)象不僅僅是具體的事物.例如:小到一個(gè)整數(shù),大到復(fù)雜的飛機(jī).還包括抽象的概念和計(jì)劃.
對(duì)象都具有屬性和行為.
類(lèi)
類(lèi)是對(duì)于具有相似屬性和行為的一組對(duì)象的統(tǒng)一的抽象化的描述.
術(shù)語(yǔ):
1.接口
語(yǔ)法:interface{
public function方法名稱(chēng)() //修飾符一定是public 沒(méi)有方法體
}
接口==>抽象類(lèi),接口==>類(lèi) implements
抽象類(lèi)==>類(lèi) extends
類(lèi)到==>對(duì)象 new
2.抽象類(lèi)
概念:含有抽象的成員方法
語(yǔ)法:abstract class{
abstract function 方法名稱(chēng)() //抽象方法,沒(méi)有方法體
public function 方法名稱(chēng)(){ //普通方法
方法體
}
}
特點(diǎn):不能夠?qū)嵗橄箢?lèi) 如果繼承抽象類(lèi),必須重載抽象方法
3.類(lèi):
語(yǔ)法結(jié)構(gòu): [修飾符] class 類(lèi)名 extends 父類(lèi) implements 接口..{
[訪問(wèn)修飾符][static] 屬性名稱(chēng)[=屬性值]
[訪問(wèn)修飾符][static] function 方法名稱(chēng)(參數(shù),參數(shù)2){
}
}
命名方式:
大駝峰:每個(gè)單詞首字母大寫(xiě) (HelloWord)
小駝峰:首字母小寫(xiě),之后每個(gè)單詞首字母大寫(xiě) (helloWord)
蛇形:小寫(xiě)+下劃線 (hello_word)
訪問(wèn)修飾符
public
protected受保護(hù)的.只能在類(lèi)和子類(lèi)中訪問(wèn)
private私有的 只能在類(lèi)里訪問(wèn)
方法:
魔術(shù)方法
__get() 在對(duì)象中(類(lèi)的外部)訪問(wèn)非公有化成員屬性時(shí)自動(dòng)調(diào)用
__set() 給非公有化成員屬性賦初值
__isset()
__unset()
__autoload()
__clone
__call() 當(dāng)調(diào)用未聲明的方法時(shí)
__callStatic 當(dāng)調(diào)用未聲明的靜態(tài)方法時(shí)
普通方法 [訪問(wèn)修飾符]{關(guān)鍵字聲明}function 函數(shù)名(參數(shù)1 參數(shù)2..){}
構(gòu)造函數(shù) 類(lèi)實(shí)例化時(shí)自動(dòng)調(diào)用(做實(shí)例化初始化的準(zhǔn)備工作)
析構(gòu)函數(shù) 收尾工作,釋放資源
屬性:
變量
常量:const
關(guān)鍵字:
final
static
4.對(duì)象
new 類(lèi)名稱(chēng) 實(shí)例化
5.魔術(shù)常量
LINK
METHOD
二.語(yǔ)法
1.類(lèi)
[一些修飾符]class 類(lèi)名稱(chēng){
}
--類(lèi)文件
1.一個(gè)類(lèi)文件里面建議只存放一個(gè)類(lèi)
2.類(lèi)文件名稱(chēng):類(lèi)名稱(chēng).class.php
--1.類(lèi)名稱(chēng)
命名規(guī)則
數(shù)字,字母,下劃線,其中數(shù)字不能作為起始.
類(lèi)名稱(chēng)建議采用大駝峰式命名規(guī)則
類(lèi)名稱(chēng)要盡量起的有意義
--2.類(lèi)中具有成員屬性和成員方法
--成員屬性 類(lèi)中的成員屬性的定義,類(lèi)似于在類(lèi)外聲明變量
-訪問(wèn)修飾符 (public) $變量名稱(chēng);
-訪問(wèn)修飾符 (public) $變量名稱(chēng)=初值;(不建議直接賦初值)
--成員方法 在類(lèi)中聲明成員方法和在類(lèi)外聲明自定義函數(shù)是一致的
[訪問(wèn)修飾符] function成員方法名稱(chēng)([參數(shù)..]){
方法體
return/echo
}
2.類(lèi)的實(shí)例化
將類(lèi)轉(zhuǎn)化為對(duì)象的過(guò)程
$變量名稱(chēng)= new 類(lèi)名稱(chēng);
或
$變量名稱(chēng)= new 類(lèi)名稱(chēng)([參數(shù)]);
--對(duì)于類(lèi)外成員屬性的訪問(wèn)
1)讀
$變量名稱(chēng)->成員屬性
注意:成員屬性不要加$
2)寫(xiě)
$變量名稱(chēng)->成員屬性=值
--對(duì)于類(lèi)成員方法的訪問(wèn)
$變量名稱(chēng)->成員方法名稱(chēng)([參數(shù)]);
3.特殊的類(lèi)對(duì)象 $this
在類(lèi)中對(duì)類(lèi)的成員屬性和成員方法進(jìn)行訪問(wèn)
$this->成員屬性;
$this->成員方法();
4.構(gòu)造函數(shù)/構(gòu)造方法
構(gòu)造函數(shù)的函數(shù)名稱(chēng)是固定的
[訪問(wèn)修飾符]function __construct([參數(shù)]){
函數(shù)體
return/echo
}
--調(diào)用
當(dāng)類(lèi)被實(shí)例化時(shí),構(gòu)造函數(shù)會(huì)被自動(dòng)調(diào)用
--用途
用于初始化工作
5.析構(gòu)函數(shù)
方法名稱(chēng)特殊,已經(jīng)固定好的
function __destruct(){
函數(shù)體
}
--調(diào)用
類(lèi)對(duì)象被引用結(jié)束以后 自動(dòng)調(diào)用
--用途
清理:資源(內(nèi)存)回收
面向?qū)ο笕筇卣?br> 繼承 封裝 多態(tài)
1.封裝
應(yīng)用訪問(wèn)修飾符,對(duì)類(lèi)中的成員屬性和成員方法進(jìn)行封裝,使其形成一個(gè)獨(dú)立的運(yùn)行單位,盡可能隱藏類(lèi)中成員屬性和成員方法實(shí)現(xiàn)的細(xì)節(jié).
--訪問(wèn)修飾符
public 公共的
protected
private 私有的
2.魔術(shù)方法
--魔術(shù)方法的特點(diǎn)
所有的魔術(shù)方法,方法名稱(chēng)固定
所有的魔術(shù)方法,調(diào)用的機(jī)制是特殊的
有些魔術(shù)方法,有自己特殊的語(yǔ)法要求
所有的魔術(shù)方法,都有自己特殊的用途
__construct()
__destruct()
__get($name 在類(lèi)外訪問(wèn)非公有化的成員屬性的名字)
1.在類(lèi)外訪問(wèn)非公有化 成員屬性時(shí),魔術(shù)方法__get()會(huì)被自動(dòng)調(diào)用
2.魔術(shù)方法__get()要求必須有一個(gè)參數(shù)
3.用途:讀取非公有化成員屬性時(shí),應(yīng)用魔術(shù)方法__get()完成
__set($name,$value $name在類(lèi)外設(shè)置的非公有化成員屬性的名稱(chēng) $value 類(lèi)外的值)
- 方法名稱(chēng)__set()
- 在類(lèi)外給非公有化(public)成員屬性賦值時(shí).魔術(shù)方法__set()會(huì)被自動(dòng)調(diào)用.
- 語(yǔ)法要求:需要兩個(gè)參數(shù).
- 用途:給成員屬性設(shè)置值.
與面向?qū)ο笙嚓P(guān)的關(guān)鍵詞
1.const
功能:用于聲明常量
語(yǔ)法:常量名稱(chēng) = 常量值
常量名稱(chēng):
--常量名稱(chēng)盡量采用大寫(xiě)
--常量一經(jīng)定義不能改變(不能重復(fù)定義同一常量)
常量的訪問(wèn)
--類(lèi)外 類(lèi)名稱(chēng)::常量名稱(chēng)
--類(lèi)里 self::常量名稱(chēng)
2.static
功能:在類(lèi)中可以用于修飾類(lèi)中的成員屬性和成員方法
訪問(wèn)
--類(lèi)外 類(lèi)名稱(chēng)::靜態(tài)化成員屬性名稱(chēng)
--類(lèi)里 self::靜態(tài)化成員屬性名稱(chēng)
靜態(tài)化的成員方法的聲明
static functionsay(){
}
--類(lèi)外 類(lèi)名稱(chēng)::成員方法名稱(chēng)();
--類(lèi)里 self::成員方法名稱(chēng)();
注意:
在靜態(tài)化的成員方法中,不能訪問(wèn)非靜態(tài)化的成員屬性或者成員方法
(在靜態(tài)化的成員方法中,不能出現(xiàn)$this)
二.繼承
繼承是定義一個(gè)新的類(lèi),繼承先前定義類(lèi)中的成員方法和成員屬性,這個(gè)新的類(lèi)中也可以定義新的成員屬性和成員方法,從而實(shí)現(xiàn)類(lèi)的層級(jí)關(guān)系
先前定義的類(lèi):基類(lèi),父類(lèi)
新定義的類(lèi):派生類(lèi),子類(lèi)
PHP是單繼承
一個(gè)子類(lèi)只能有一個(gè)父類(lèi),一個(gè)父類(lèi)可以有多個(gè)子類(lèi)
--繼承語(yǔ)法
[修飾符] class 子類(lèi)名稱(chēng) extends 父類(lèi)名稱(chēng){}
--重載
在子類(lèi)中重新定義父類(lèi)中的成員方法
三.與面向?qū)ο笙嚓P(guān)的關(guān)鍵詞
const 常量名稱(chēng) = 常量值;
static 聲明靜態(tài)化的成員屬性和成員方法
訪問(wèn)成員屬性 類(lèi)名稱(chēng)::成員屬性 類(lèi)外
訪問(wèn)成員方法 類(lèi)名稱(chēng)::成員方法 類(lèi)外
成員屬性 self::成員屬性 類(lèi)里
成員方法 self::成員方法 類(lèi)里
final
- 被final修飾的類(lèi)不能夠被繼承.
- 被final修飾的成員方法不能夠被重載.
instanceof
--功能:判斷一個(gè)類(lèi)對(duì)象是否屬于這個(gè)類(lèi)
三.鏈?zhǔn)綄?xiě)法
四.魔術(shù)方法(面試常問(wèn))
__construct()
__destruct()
__get()
__set()
__clone()
1.__clone()
2.特殊的調(diào)用時(shí)機(jī),在應(yīng)用關(guān)鍵詞clone時(shí),會(huì)被自動(dòng)調(diào)用.
3.魔術(shù)方法clone沒(méi)有特殊的語(yǔ)法要求.
4.用途:
- 給成員屬性賦初值.
- 單例模式.
--__isset()
在類(lèi)外應(yīng)用isset判斷類(lèi)中的非公有化成員屬性時(shí),魔術(shù)方法__isset()會(huì)被自動(dòng)調(diào)用
__isset()魔術(shù)方法需要有一個(gè)參數(shù).
-用途:用于判斷類(lèi)中的非公有化的成員屬性是否被設(shè)置了初值
--__unset() (!!!沒(méi)有返回值)
觸發(fā):在類(lèi)外應(yīng)用unset()刪除類(lèi)中非公有化的成員屬性時(shí),魔術(shù)方法__unset()會(huì)被自動(dòng)調(diào)用
必須要一個(gè)參數(shù)
用途:用于判斷非公有化成員屬性
--__autoload($classname)
觸發(fā):當(dāng)類(lèi)被實(shí)例化時(shí),會(huì)被自動(dòng)調(diào)用.
必須要一個(gè)參數(shù)
用途:類(lèi)的自動(dòng)加載
注:寫(xiě)在類(lèi)外
五.多態(tài)
有繼承關(guān)系的類(lèi)對(duì)象,對(duì)于相同的成員方法調(diào)用,產(chǎn)生不同的結(jié)果.
多態(tài)也稱(chēng)為:同名異式
語(yǔ)法:
--抽象方法和抽象類(lèi)
1.抽象方法
抽象方法是沒(méi)有方法體的方法
語(yǔ)法:
abstract function 抽象方法名稱(chēng)();
2.抽象類(lèi)
abstract class 抽象類(lèi)名稱(chēng){}
3.如果一個(gè)類(lèi)中含有抽象的成員方法,則這個(gè)類(lèi)必須被聲明為抽象類(lèi)
4.一個(gè)抽象類(lèi)中可以沒(méi)有抽象的成員方法,可以有普通的成員方法和成員屬性
5.抽象類(lèi)不能夠被實(shí)例化,抽象類(lèi)在項(xiàng)目中是用來(lái)聲明規(guī)范的.抽象類(lèi)僅僅能用來(lái)繼承,如果一個(gè)子類(lèi)繼承了抽象類(lèi),則必須重載抽象類(lèi)中的全部抽象方法.
6.子類(lèi)對(duì)于抽象類(lèi)的繼承,應(yīng)用關(guān)鍵詞extends
六.接口
1.接口是抽象類(lèi)的抽象類(lèi)
2.語(yǔ)法:interface 接口名稱(chēng){}
3.在接口中,只能有常量和抽象的成員方法
4.在接口中抽象的成員方法的聲明不能應(yīng)用關(guān)鍵詞abstract.
5.接口也不能被實(shí)例化,接口僅僅用來(lái)被繼承,接口是用來(lái)聲明規(guī)范
6.接口對(duì)于接口的繼承:extends
6.類(lèi)對(duì)于接口的繼承:implements
7.如果一個(gè)類(lèi)繼承了接口,則必須重載接口中的全部的抽象方法
8.一個(gè)子類(lèi)可以同時(shí)繼承父類(lèi)和接口.一個(gè)子類(lèi)可以繼承多個(gè)接口
class 子類(lèi)名稱(chēng) extends 父類(lèi)名稱(chēng)
implements 接口名稱(chēng)[,接口名稱(chēng)...]
get_class([object $object=null])
功能:獲取對(duì)象的類(lèi)名稱(chēng)
參數(shù):
object 要獲取類(lèi)名稱(chēng)的對(duì)象.
返回:類(lèi)名稱(chēng).
生成隨機(jī)值
uniqid([$prefix])