- 論壇徽章:
- 0
|
作者:高洛峰 來源:《PHPer》雜志
本部分一共包括以下一些技術(shù)點(diǎn):
1.面向?qū)ο蟮母拍?br />
2.什么是類,什么是對象,類和對象這間的關(guān)系
3.什么是面向?qū)ο缶幊棠兀?br />
4.如何抽象出一個類?
5.如何實(shí)例化對象?
6.如何去使用對象中的成員?
7.特殊的引用“$this”的使用
8.構(gòu)造方法與析構(gòu)方法
9.封裝性
10.__set()、 __get()、 __isset()、 __unset()四個方法的應(yīng)用
11.類的繼承
12.多態(tài)的應(yīng)用
13.重載新的方法
14.訪問類型
15.靜態(tài)成員的使用
16.final關(guān)鍵字的應(yīng)用
17.__toString()方法
18.克隆對象
19.__call處理調(diào)用錯誤
20.自動加載類
21.把對象串行化
22.抽象方法和抽象類
23.php5接口技術(shù)
1.面向?qū)ο蟮母拍?/strong>
面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計)是一種計算機(jī)編程架構(gòu),OOP的一條基本原則是計算機(jī)程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成,OOP達(dá)到了軟件工程的三個目標(biāo):重用性、靈活性和擴(kuò)展性。為了實(shí)現(xiàn)整體運(yùn)算,每個對象都能夠接收信息、處理數(shù)據(jù)和向其它對象發(fā)送信息。面向?qū)ο笠恢笔擒浖_發(fā)領(lǐng)域內(nèi)比較熱門的話題,首先,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律。其次,采用面向?qū)ο蠓椒ǹ梢允瓜到y(tǒng)各部分各司其職、各盡所能。為編程人員敞開了一扇大門,使其編程的代碼更簡潔、更易于維護(hù),并且具有更強(qiáng)的可重用性。有人說PHP不是一個真正的面向?qū)ο蟮恼Z言,這是事實(shí)。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統(tǒng)的過程化編程。然而,對于大型項(xiàng)目,你可能需要在PHP 中使用純的OOP去聲明類,而且在你的項(xiàng)目里只用對象和類。這個概念我先不多說了,因?yàn)橛泻芏嗯笥堰h(yuǎn)離面向?qū)ο缶幊痰闹饕蚓褪且唤佑|面向?qū)ο蟾拍畹臅r候就理解不上去,所以就不想去學(xué)下去了。等讀者看完整體內(nèi)容后再去把概念搞明白吧。
2.什么是類,什么是對象,類和對象這間的關(guān)系
類的概念:類是具有相同屬性和服務(wù)的一組對象的集合。它為屬于該類的所有對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個獨(dú)立的程序單位,它應(yīng)該有一個類名并包括屬性說明和服務(wù)說明兩個主要部分。
對象的概念:對象是系統(tǒng)中用來描述客觀事物的一個實(shí)體,它是構(gòu)成系統(tǒng)的一個基本單位。一個對象由一組屬性和對這組屬性進(jìn)行操作的一組服務(wù)組成。從更抽象的角度來說,對象是問題域或?qū)崿F(xiàn)域中某些事物的一個抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用;它是一組屬性和有權(quán)對這些屬性進(jìn)行操作的一組服務(wù)的封裝體。客觀世界是由對象和對象之間的聯(lián)系組成的。
類與對象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對象,而對一類對象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對象。
上面大概就是它們的定義吧,也許你是剛接觸面向?qū)ο蟮呐笥眩?不要被概念的東西搞暈了,給你舉個例子吧,如果你去中關(guān)村想買幾臺組裝的PC機(jī),到了那里你第一步要干什么,是不是裝機(jī)的工程師和你坐在一起,按你提供的信息和你一起完成一個裝機(jī)的配置單呀,這個配置單就可以想象成是類,它就是一張紙,但是它上面記錄了你要買的PC機(jī)的信息,如果用這個配置單買10臺機(jī)器,那么這10臺機(jī)子,都是按這個配置單組成的,所以說這10臺機(jī)子是一個類型的,也可以說是一類的。那么什么是對象呢,類的實(shí)例化結(jié)果就是對象,用這個配置單配置出來(實(shí)例化出來)的機(jī)子就是對象,是我們可以操作的實(shí)體,10臺機(jī)子,10個對象。每臺機(jī)子都是獨(dú)立的,只能說明他們是同一類的,對其中一個機(jī)做任何動作都不會影響其它9臺機(jī)器,但是我對類修改,也就是在這個配置單上加一個或少一個配件,那么裝出來的9個機(jī)子都改變了,這是類和對象的關(guān)系(類的實(shí)例化結(jié)果就是對象)。
3.什么是面向?qū)ο缶幊棠兀?/strong>
就不說他的概念,如果你想建立一個電腦教室,首先要有一個房間,房間里面要有N臺電腦,有N張桌子, N把椅子,白板,投影機(jī)等等,這些是什么,剛才咱們說了,這就是對象,能看到的一個個的實(shí)體,可以說這個電腦教室的單位就是這一個個的實(shí)體對象,它們共同組成了這個電腦教室,那么我們是做程序,這和面向?qū)ο笥惺裁搓P(guān)系呢?開發(fā)一個系統(tǒng)程序和建一個電腦教室類似,你把每個獨(dú)立的功能模塊抽象成類,形成對象,由多個對象組成這個系統(tǒng),這些對象之間都能夠接收信息、處理數(shù)據(jù)和向其它對象發(fā)送信息等等相互作用。就構(gòu)成了面向?qū)ο蟮某绦颉?br />
4.如何抽象出一個類?
上面已經(jīng)介紹過了,面向?qū)ο蟪绦虻膯挝痪褪菍ο,但對象又是通過類的實(shí)例化出來的,所以我們首先要做的就是如何來聲明類,做出來一個類很容易,只要掌握基本的程序語法定義規(guī)則就可以做的出來,那么難點(diǎn)在那里呢?一個項(xiàng)目要用到多少個類,用多少個對象,在那要定義類,定義一個什么樣的類,這個類實(shí)例化出多少個對象,類里面有多少個屬性,有多少個方法等等,這就需要讀者通過在實(shí)際的開發(fā)中就實(shí)際問題分析設(shè)計和總結(jié)了。
類的定義:
class 類名{
}
使用一個關(guān)鍵字class和后面加上一個你想要的類名以及加上一對大括號, 這樣一個類的結(jié)構(gòu)就定義出來了,只要在里面寫代碼就可以了,但是里面寫什么? 能寫什么?怎樣寫才是一個完整的類呢?上面講過來,使用類是為了讓它實(shí)例出對象來給我們用,這就要知道你想要的是什么樣的對象了,像上面我們講的一個裝機(jī)配置單上寫什么,你裝出來的機(jī)子就有什么。比如說,一個人就
是一個對象,你怎么把一個你看好的人推薦給你們領(lǐng)導(dǎo)呢?當(dāng)然是越詳細(xì)越好了:
首先,你會介紹這個人姓名、性別、年齡、身高、體重、電話、家庭住址等等。
然后,你要介紹這個人能做什么,可以開車,會說英語,可以使用電腦等等。
只要你介紹多一點(diǎn),別人對這個人就多一點(diǎn)了解,這就是我們對一個人的描述, 現(xiàn)在我們總結(jié)
一下,所有的對象我們用類去描述都是類似的,從上面人的描述可以看到, 做出一個類來,從定義的角度分兩部分,第一是從靜態(tài)上描述,第二是從動態(tài)上描述,靜態(tài)上的描述就是我們所說的
屬性,像上面我們看到的,人的姓名、性別、年齡、身高、體重、電話、家庭住址等等。動態(tài)上也就是人的這個對象的功能,比如這個人可以開車,會說英語,可以使用電腦等等,抽象成程序時,我們把動態(tài)的寫成函數(shù)或者說是方法,函數(shù)和方法是一樣的。所以,所有類都是從屬性和方法這兩方面去寫,屬性又叫做這個類的成員屬性,方法叫做這個類的成員方法。
class 人{(lán)
成員屬性:姓名、性別、年齡、身高、體重、電話、家庭住址
成員方法:可以開車, 會說英語, 可以使用電腦
}
屬性:
通過在類定義中使用關(guān)鍵字" var "來聲明變量,即創(chuàng)建了類的屬性,雖然在聲明成員屬性的時候可以給定初始值, 但是在聲明類的時候給成員屬性初使值是沒有必要的,比如說要是把人的姓名賦上“張三”,那么用這個類實(shí)例出幾十個人,這幾十個人都叫張三了,所以沒有必要, 我們在實(shí)例出對象后給成員屬性初始值就可以了。
如: var $somevar;
方法(成員函數(shù)):
通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法。
如: function somefun(參數(shù)列表)
{ ... ... }
class Person
{
//下面是人的成員屬性
var $name; //人的名子
var $sex; //人的性別
var $age; //人的年齡
//下面是人的成員方法
function say() //這個人可以說話的方法
{
echo "這個人在說話";
}
function run() //這個人可以走路的方法
{
echo "這個人在走路";
}
}
?>
上面就是一個類的聲明,從屬性和方法上聲明出來的一個類,但是成員屬性最好在聲明的時候
不要給初始的值,因?yàn)槲覀冏龅娜诉@個類是一個描述信息,將來用它實(shí)例化對象,比如實(shí)例化出來10個人對象,那么這10個人, 每一個人的名子,性別, 年齡都是不一樣的,所以最好不要在這個地方給成員屬性賦初值,而是對每個對象分別賦值的。
用同樣的辦法可以做出你想要的類了, 只要你能用屬性和方法能描述出來的實(shí)體都可以定義成類,去實(shí)例化對象。
為了加強(qiáng)你對類的理解,我們再做一個類,做一個形狀的類,形狀的范圍廣了點(diǎn), 我們就做個矩形吧,先分析一下,想一想從兩方面分析,矩形的屬性都有什么?矩形的功能都有什么?
class 矩形
{
//矩形的屬性
矩形的長;
矩形的寬;
//矩形的方法
矩形的周長;
矩形的面積;
}
class Rect
{
var $kuan;
var $gao;
function zhouChang()
{
計算矩形的周長;
}
function mianJi()
{
計算矩形的面積;
}
}
?>
如果用這個類來創(chuàng)建出多個矩形對象,每個矩形對象都有自己的長和寬, 都可以求出自己的周長和面積了。
類的聲明我們就到這里吧。
5.如何實(shí)例化對象
我們上面說過面向?qū)ο蟪绦虻膯挝痪褪菍ο,但對象又是通過類的實(shí)例化出來的,既然我們類會聲明了,下一步就是實(shí)例化對象了。
當(dāng)定義好類后,我們使用new關(guān)鍵字來生成一個對象。
$對象名稱 = new 類名稱();
class Person
{
//下面是人的成員屬性
var $name; //人的名子
var $sex; //人的性別
var $age; //人的年齡
//下面是人的成員方法
function say() //這個人可以說話的方法
{
echo "這個人在說話";
}
function run() //這個人可以走路的方法
{
echo "這個人在走路";
}
}
$p1=new Person();
$p2=new Person();
$p3=new Person();
?>
$p1=new Person();
這條代碼就是通過類產(chǎn)生實(shí)例對象的過程,$p1就是我們實(shí)例出來的對象名稱,同理,$p2, $p3也是我們實(shí)例出來的對象名稱,一個類可以實(shí)例出多個對象,每個對象都是獨(dú)立的,上面的代碼相當(dāng)于實(shí)例出來3個人來,每個人之間是沒有聯(lián)系的,只能說明他們都是人類,每個人都有自己的姓名,性別和年齡的屬性,每個人都有說話和走路的方法,只要是類里面體現(xiàn)出來的成員屬性和成員方法,實(shí)例化出來的對象里面就包含了這些屬性和方法。
對像在PHP里面和整型、浮點(diǎn)型一樣,也是一種數(shù)據(jù)類,都是存儲不同類型數(shù)據(jù)用的,在運(yùn)行的時候都要加載到內(nèi)存中去用,那么對象在內(nèi)存里面是怎么體現(xiàn)的呢?內(nèi)存從羅輯上說大體上是分為4段, ?臻g段、堆空間段、代碼段、 初始化靜態(tài)段,程序里面不同的聲明放在不同的內(nèi)存段里面,?臻g段是存儲占用相同空間長度并且占用空間小的數(shù)據(jù)類型的地方,比如說整型1, 10, 100, 1000, 10000, 100000等等,在內(nèi)存里面占用空間是等長的,都是64位4個字節(jié)。 那么數(shù)據(jù)長度不定長,而且占有空間很大的數(shù)據(jù)類型的數(shù)據(jù)放在那內(nèi)存的那個段里面呢?這樣的數(shù)據(jù)是放在堆內(nèi)存里面的。棧內(nèi)存是可以直接存取的,而堆內(nèi)存是不可以直接存取的內(nèi)存。對于我們的對象來數(shù)就是一種大的數(shù)據(jù)類型而且是占用空間不定長的類型,所以說對象是放在堆里面的,但對象名稱是放在棧里面的,這樣通過對象名稱就可以使用對象了。
$p1=new Person();
對于這個條代碼, $p1是對象名稱在棧內(nèi)存里面,new Person()是真正的對象是在堆內(nèi)存里面的,具體的請看下圖:
![]()
從上圖可以看出$p1=new Person();等號右邊是真正的對象實(shí)例,在堆內(nèi)存里面的實(shí)體,上圖一共有3次new Person(),所以會在堆里面開辟3個空間,產(chǎn)生3個實(shí)例對象,每個對象之間都是相互獨(dú)立的,使用自己的空間,在PHP里面,只要有一個new這個關(guān)鍵字出現(xiàn)就會實(shí)例化出來一個對象,在堆里面開辟一塊自己的空間。
每個在堆里面的實(shí)例對象是存儲屬性的,比如說,現(xiàn)在堆里面的實(shí)例對象里面都存有姓名、性別和年齡。每個屬性又都有一個地址。
$p1=new Person();等號的右邊$p1是一個引用變量,通過賦值運(yùn)算符“=”把對象的首地址賦給“$p1”這個引用變量,所以$p1是存儲對象首地址的變量,$p1放在棧內(nèi)存里邊,$p1相當(dāng)于一個指針指向堆里面的對象,所以我們可以通過$p1這個引用變量來操作對象,通常我們也稱對象引用為對象。
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u/30002/showart_363604.html |
|