版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Linux+PHP+MYSQL第5講 面向?qū)ο?第5講 面向?qū)ο蟮腜HPOOP的好處關(guān)鍵的OOP概念構(gòu)造函數(shù)和析構(gòu)函數(shù)靜態(tài)類成員OOP(Object-Oriented Programming,面向?qū)ο蟮木幊蹋㎡OP的好處封裝 繼承 多態(tài)什么是面向?qū)ο缶幊堂鎸ο蠹夹g(shù)的基本觀點(diǎn)如下:(1)客觀世界由對象組成。(2)具有相同數(shù)據(jù)和操作的對象可歸納成類。(3)類可以派生出子類,子類除了繼承除了繼承父類的全部特性外還可以有自己的特性(4)對象之間的聯(lián)系通過消息傳遞來維系。關(guān)鍵的OOP概念面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計)是一種計算機(jī)編程
2、架構(gòu),OOP的一條基本原則是計算機(jī)程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成,OOP達(dá)到了軟件工程的三個目標(biāo):重用性、靈活性和擴(kuò)展性。面向?qū)ο笠恢笔擒浖_發(fā)領(lǐng)域內(nèi)比較熱門的話題,首先,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律。 其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職、各盡所能。為編程人員敞開了一扇大門,使其編程的代碼更簡潔、更易于維護(hù),并且具有更強(qiáng)的可重用性。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統(tǒng)的過程化編程 。然而,對于大型項目,你可能需要在PHP 中使用純的OOP去聲明類,而且在你的項目里只用對象和類 。關(guān)鍵的OOP概念面向?qū)ο缶幊趟枷氲慕?關(guān)鍵的OOP概念
3、的理解掌握,這是基礎(chǔ) 例如:類、類的屬性、類的方法、訪問權(quán)限 構(gòu)造函數(shù)、析構(gòu)函數(shù)等。 如何應(yīng)用面向?qū)ο蟮木幊趟枷?主要是根據(jù)畫面和系統(tǒng)的開發(fā)架構(gòu),源頭:理解畫面從何而來,目的:類設(shè)計好之后的代碼如何實現(xiàn)。 關(guān)鍵的OOP概念類 類是具有相同屬性和服務(wù)的一組對象的集合。它為屬于該類的所有對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個獨(dú)立的程序單位,它應(yīng)該有一個類名并包括屬性說明和服務(wù)說明兩個主要部分。 對象 對象是系統(tǒng)中用來描述客觀事物的一個實體,它是構(gòu)成系統(tǒng)的一個基本單位。一個對象由一組屬性和對這組屬性進(jìn)行操作的一組服務(wù)組成。 類和對象這間的關(guān)系 類
4、與對象的關(guān)系就如模具和鑄件的關(guān)系,類的實例化結(jié)果就是對象,而對一類對象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對象。 舉例:一個裝機(jī)的配置單,這個配置單就可以想象成是類 。組裝的PC機(jī)可以看作是該類的對象。將相關(guān)的變量和方法封裝進(jìn)一個簡潔的軟件組合是一種簡單而強(qiáng)大的思想,它給軟件開發(fā)人員提供了兩個主要的好處:模塊化:一個對象的源代碼可以獨(dú)立于其他對象的源代碼進(jìn)行編寫和維護(hù)。另外,對象很容易地在系統(tǒng)中傳遞。你可以將你的自行車對象交給其他人,而它仍然會正常工作。 隱藏信息:對象有一個公共接口,其他對象可以使用這個接口與它通信。對象可以維護(hù)私有的信息和方法,可以在任何時候改變
5、這些信息和方法,而不影響依賴于它的其他對象。你不需要理解你自行車使用的變速齒輪機(jī)制就能夠使用它。軟件對象 對象屬性型號價格里程行為起動停車行駛屬性車輪數(shù)量檔的數(shù)量行為加速換檔剎車屬性名稱顏色品種行為搖尾巴吃東西犬 吠 關(guān)鍵的OOP概念面向?qū)ο?如果你想建立一個電腦教室,首先要有一個房間,房間里面要有N臺電腦,有N張桌子, N把椅子,白板,投影機(jī)等等,這些是什么,剛才咱們說了,這就是對象,能看到的一個個的實體,可以說這個電腦教室的單位就是這一個個的實體對象,它們共同組成了這個電腦教室,那么我們是做程序,這和面向?qū)ο笥惺裁搓P(guān)系呢?開發(fā)一個系統(tǒng)程序和建一個電腦教室類似,你把每個獨(dú)立的功能模塊抽象成類
6、,形成對象,由多個對象組成這個系統(tǒng),這些對象之間都能夠接收信息、處理數(shù)據(jù)和向其它對象發(fā)送信息等等相互作用。就構(gòu)成了面向?qū)ο蟮某绦颉?如何抽象出一個類? 上面已經(jīng)介紹過了,面向?qū)ο蟪绦虻膯挝痪褪菍ο?,但對象又是通過類的實例化出來的,所以我們首先要做的就是如何來聲明類,做出來一個類很容易,只要掌握基本的程序語法定義規(guī)則就可以做的出來,那么難點(diǎn)在那里呢?一個項目要用到多少個類,用多少個對象,在那要定義類,定義一個什么樣的類,這個類實例化出多少個對象,類里面有多少個屬性,有多少個方法等等,這就需要讀者通過在實際的開發(fā)中就實際問題分析設(shè)計和總結(jié)了。 (系統(tǒng)架構(gòu)師主要是根據(jù)每個項目的頁面來判斷)。關(guān)鍵的O
7、OP概念類的定義: class 類名 舉例:人是一個對象,你怎么把一個你看好的人推薦給你們領(lǐng)導(dǎo)呢?首先,你會介紹這個人姓名、性別、年齡、身高、體重、電話、家庭住址等等。然后,你要介紹這個人能做什么,可以開車,會說英語,可以使用電腦等等??偨Y(jié):所有的對象我們用類去描述都是類似的,從上面人的描述可以看到, 做出一個類來,從定義的角度分兩部分,第一是從靜態(tài)上描述,第二是從動態(tài)上描述,靜態(tài)上的描述就是我們所說的屬性,像上面我們看到的,人的姓名、性別、年齡、身高、體重、電話、家庭住址等等。 動態(tài)上也就是人的這個對象的功能,比如這個人可以開車,會說英語,可以使用電腦等等 。關(guān)鍵的OOP概念抽象: 抽象成程
8、序時,我們把靜態(tài)的說成類的屬性,把動態(tài)的寫成函數(shù)或者說是方法,函數(shù)和方法。 所有類都是從屬性和方法這兩方面去寫,屬性又叫做這個類的成員屬性,方法叫做這個類的成員方法。 class 人 成員屬性:姓名、性別、年齡、身高、體重、電話、家庭住址成員方法:可以開車, 會說英語, 可以使用電腦 屬性:通過在類定義中使用關(guān)鍵字 var 來聲明變量,即創(chuàng)建了類的屬性,雖然在聲明成員屬性的時候可以給定初始值, 但是在聲明類的時候給成員屬性初使值是沒有必要的,比如說要是把人的姓名賦上“張三”,那么用這個類實例出幾十個人,這幾十個人都叫張三了,所以沒有必要, 我們在實例出對象后給成員屬性初始值就可以了。如:var
9、 $somevar;關(guān)鍵的OOP概念方法(成員函數(shù)):通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法。如:function somefun(參數(shù)列表) . . 關(guān)鍵的OOP概念注意:不要給初始的值,因為我們做的人這個類是一個描述信息,將來用它實例化對象,比如實例化出來10個人對象,那么這10個人, 每一個人的名子,性別, 年齡都是不一樣的,所以最好不要在這個地方給成員屬性賦初值,而是對每個對象分別賦值的。 再做一個類,我們就做個矩形吧,先分析一下,想一想從兩方面分析,矩形的屬性都有什么?矩形的功能都有什么?class 矩形/矩形的屬性矩形的長; 矩形的寬;/矩形的方法矩形的周長;矩形的面積;關(guān)鍵的O
10、OP概念關(guān)鍵的OOP概念如何去使用對象中的成員 ?上面看到PHP對象中的成員有兩種一種是成員屬性,一種是成員方法。對象我們已經(jīng)可以聲明了,$p1=new Person(); 怎么去使用對象的成員呢?要想訪問對象中的成員就要使用一個特殊的操作符“-”來完成對象成員的訪問: 對象-屬性 $p1-name; $p2-age; $p3-sex; 對象-方法 $p1-say(); $p2-run();name=”張三”;$p1-sex=”男”;$p1-age=20;/下面三行是訪問$p1對象的屬性echo “p1對象的名子是:”.$p1-name.”;echo “p1對象的性別是:”.$p1-sex.”
11、;echo “p1對象的年齡是:”.$p1-age.”;/下面兩行訪問$p1對象中的方法$p1-say();$p1-run();關(guān)鍵的OOP概念下面三行是給$p2對象屬性賦值$p2-name=”李四”;$p2-sex=”女”;$p2-age=30;/下面三行是訪問$p2對象的屬性echo “p2對象的名子是:”.$p2-name.”;echo “p2對象的性別是:”.$p2-sex.”;echo “p2對象的年齡是:”.$p2-age.”;/下面兩行訪問$p2對象中的方法$p2-say();$p2-run();/下面三行是給$p3對象屬性賦值$p3-name=”王五”;$p3-sex=”男”;
12、$p3-age=40;/下面三行是訪問$p3對象的屬性echo “p3對象的名子是:”.$p3-name.”;echo “p3對象的性別是:”.$p3-sex.”;echo “p3對象的年齡是:”.$p3-age.”;/下面兩行訪問$p3對象中的方法$p3-say();$p3-run();關(guān)鍵的OOP概念特殊的引用“$this”的使用 現(xiàn)在我們知道了如何訪問對象中的成員,是通過“對象-成員”的方式訪問的,這是在對象的外部去訪問對象中成員的形式,那么如果我想在對象的內(nèi)部,讓對象里的方法訪問本對象的屬性,或是對象中的方法去調(diào)用本對象的其它方法這時我們怎么辦?因為對象里面的所有的成員都要用對象來調(diào)用
13、,包括對象的內(nèi)部成員之間的調(diào)用,所以在PHP里面給我提供了一個本對象的引用$this,每個對象里面都有一個對象的引用$this來代表這個對象,完成對象內(nèi)部成員的調(diào)用, this的本意就是“這個”的意思,上面的實例里面,我們實例化三個實例對象$P1、 $P2、 $P3,這三個對象里面各自存在一個$this分別代表對象$p1、$p2、$p3 。關(guān)鍵的OOP概念通過上圖我們可以看到,$this就是對象內(nèi)部代表這個對象的引用,在對象內(nèi)部和調(diào)用本對象的成員和對象外部調(diào)用對象的成員所使用的方式是一樣的 修改一下上面的實例,讓每個人都說出自己的名字,性別和年齡: 關(guān)鍵的OOP概念name. 性別:.$thi
14、s-sex. 我的年齡是:.$this-age.; function run() /這個人可以走路的方法 echo 這個人在走路; 關(guān)鍵的OOP概念$p1=new Person(); /創(chuàng)建實例對象$p1$p2=new Person(); /創(chuàng)建實例對象$p2$p3=new Person(); /創(chuàng)建實例對象$p3/下面三行是給$p1對象屬性賦值$p1-name=張三;$p1-sex=男;$p1-age=20;/下面訪問$p1對象中的說話方法$p1-say();/下面三行是給$p2對象屬性賦值$p2-name=李四;$p2-sex=女;$p2-age=30;/下面訪問$p2對象中的說話方法$p
15、2-say();/下面三行是給$p3對象屬性賦值$p3-name=王五;$p3-sex=男;$p3-age=40;/下面訪問$p3對象中的說話方法$p3-say();?關(guān)鍵的OOP概念Result: 我的名字叫:張三性別:男我的年齡是:20我的名字叫:李四性別:女我的年齡是:30我的名字叫:王五性別:男我的年齡是:40在$p1、$p2和$p3這三個對象中都有say()這個方法,$this分別代表這三個對象, 調(diào)用相應(yīng)的屬性,打印出屬性的值,這就是在對象內(nèi)部訪問對象屬性的方式, 如果相在say()這個方法里調(diào)用run()這個方法也是可以的,在say()這個方法中使用$this-run()的方式來
16、完成調(diào)用。 關(guān)鍵的OOP概念構(gòu)造方法與析構(gòu)方法 大多數(shù)類都有一種稱為構(gòu)造函數(shù)的特殊方法。當(dāng)創(chuàng)建一個對象時,它將自動調(diào)用構(gòu)造函數(shù),也就是使用new這個關(guān)鍵字來實例化對象的時候自動調(diào)用構(gòu)造方法。構(gòu)造函數(shù)的聲明與其它操作的聲明一樣,只是其名稱必須是_construct( )。這是PHP5中的變化,以前的版本中,構(gòu)造函數(shù)的名稱必須與類名相同,這種在PHP5中仍然可以用,但現(xiàn)在以經(jīng)很少有人用了,這樣做的好處是可以使構(gòu)造函數(shù)獨(dú)立于類名,當(dāng)類名發(fā)生改變時不需要改相應(yīng)的構(gòu)造函數(shù)名稱了。為了向下兼容,如果一個類中沒有名為_construct( )的方法,PHP將搜索一個php4中的寫法,與類名相同名的構(gòu)造方法。
17、 格式:function _construct ( 參數(shù) ) . . 在一個類中只能聲明一個構(gòu)造方法,而是只有在每次創(chuàng)建對象的時候都會去調(diào)用一次構(gòu)造方法,不能主動的調(diào)用這個方法,所以通常用它執(zhí)行一些有用的初始化任務(wù)。比如對成屬性在創(chuàng)建對象的時候賦初值。關(guān)鍵的OOP概念name賦初使值$this-name=$name;/通過構(gòu)造方法傳進(jìn)來的$sex給成員屬性$this-sex賦初使值$this-sex=$sex;/通過構(gòu)造方法傳進(jìn)來的$age給成員屬性$this-age賦初使值$this-age=$age;/這個人的說話方法function say()echo 我的名子叫:.$this-name
18、. 性別:.$this-sex. 我的年齡是:.$this-age.;關(guān)鍵的OOP概念/通過構(gòu)造方法創(chuàng)建3個對象$p1、p2、$p3,分別傳入三個不同的實參為姓名、性別和年齡$p1=new Person(“張三”,”男”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面訪問$p1對象中的說話方法$p1-say();/下面訪問$p2對象中的說話方法$p2-say();/下面訪問$p3對象中的說話方法$p3-say();?Result:我的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30
19、我的名子叫:王五性別:男我的年齡是:40關(guān)鍵的OOP概念析構(gòu)函數(shù) 與構(gòu)造函數(shù)相對的就是析構(gòu)函數(shù)。析構(gòu)函數(shù)是PHP5新添加的內(nèi)容,在PHP4中沒有析構(gòu)函數(shù)。析構(gòu)函數(shù)允許在銷毀一個類之前執(zhí)行的一些操作或完成一些功能,比如說關(guān)閉文件,釋放結(jié)果集等,析構(gòu)函數(shù)會在到某個對象的所有引用都被刪除或者當(dāng)對象被顯式銷毀時執(zhí)行,也就是對象在內(nèi)存中被銷毀前調(diào)用析構(gòu)函數(shù)。與構(gòu)造函數(shù)的名稱類似,一個類的析構(gòu)函數(shù)名稱必須是_destruct( )。析構(gòu)函數(shù)不能帶有任何參數(shù)。 格式:function _destruct ( ) . . 關(guān)鍵的OOP概念name賦初使值$this-name=$name;/通過構(gòu)造方法傳進(jìn)來的
20、$sex給成員屬性$this-sex賦初使值$this-sex=$sex;/通過構(gòu)造方法傳進(jìn)來的$age給成員屬性$this-age賦初使值$this-age=$age;/這個人的說話方法function say()echo 我的名子叫:.$this-name. 性別:.$this-sex. 我的年齡是:.$this-age.;關(guān)鍵的OOP概念/這是一個析構(gòu)函數(shù),在對象銷毀前調(diào)用function _destruct()echo “再見”.$this-name.”;/通過構(gòu)造方法創(chuàng)建3個對象$p1、p2、$p3,分別傳入三個不同的實參為姓名、性別和年齡$p1=new Person(“張三”,”男
21、”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面訪問$p1對象中的說話方法$p1-say();/下面訪問$p2對象中的說話方法$p2-say();/下面訪問$p3對象中的說話方法$p3-say();?Result:我的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30我的名子叫:王五性別:男我的年齡是:40再見張三再見李四再見王五關(guān)鍵的OOP概念 小結(jié):類的代碼規(guī)范class Something/ 在OOP中,類的第一字母通常為大寫 var $x; #define a setter
22、 for the $x member. function setX($v) /方法開始為小寫單詞,然后使用大寫字母來分割單詞,例如:getValueOfArea( ) /另外注意Function要縮進(jìn)3格 $this-x=$v; #define a getter for the $x member. function getX( ) return this-x; #end Executive class 數(shù)據(jù)成員在類中使用”var”來定義,在給數(shù)據(jù)成員賦值之前,它們是沒有類型的。一個數(shù)據(jù)成員可以是一個整數(shù),一個數(shù)組或者是一個對象。 方法在類中被定義成函數(shù)形式,在方法中訪問類成員變量時,你應(yīng)該使
23、用$this-name,否則對一個方法來說,它只能是局部變量。(PHP5是直接可以使用變量,而不需要事先聲明,而其他語言(C#,Java),必須先聲明要一個變量的數(shù)據(jù)類型,才能使用)關(guān)鍵的OOP概念 小結(jié):類的調(diào)用$obj = new Something; /在內(nèi)存中分配存儲空間然后你可以使用成員函數(shù)通過:$obj -setX(5);$see = $obj -getX();在這個例子中,setX成員函數(shù)將5賦值給對象的成員變量x(而不是類的),然后getX返回它的值5.關(guān)鍵的OOP概念 PHP4的OOP 托PHP4的福,這個用途的適用范圍逐漸變廣起來,作為企業(yè)級的用途而使用PHP的說法時有所聞
24、,因此就用了這樣一個問題,構(gòu)筑大規(guī)模網(wǎng)站的時候,代碼的再利用性十分差。具體來說就是PHP4的面向?qū)ο笮阅芎苋?,因此?xí)慣了使用Java或C#的技術(shù)人員都對此有很多的抱怨。 逐步改善PHP4的面向?qū)ο蟮男阅?,大幅度的更改基本文法,開發(fā)者達(dá)成了更新PHP記述方法的開拓目的。關(guān)鍵的OOP概念 PHP5的新特性 對象的參照過渡是默認(rèn)的 例如: $obj = new Something; 上面的語句可以分為兩部分來理解:右邊的是第一步:在內(nèi)存中分配空間;左邊的是第二步,$obj是一個對象引用,它是一個指針,指向第一步在內(nèi)存中分配過的空間地址。而不是將右邊的內(nèi)存中的空間復(fù)制給$obj.引用了訪問屬性的限制引
25、用了訪問方法的限制抽象類和抽象方法接口Final聲明名空間類內(nèi)常量類變量統(tǒng)一的構(gòu)造函數(shù)析構(gòu)函數(shù)關(guān)鍵的OOP概念 對象的引用在PHP4中,在以變量$var1為類的實體對象時,如果使用$var2=$var1,那么,在$var2中,$var1的復(fù)制被代入。明顯的, $var2為了指向與$var1相同的對象,就要寫成 $var2=&$var1,必須要加上&作為參照。在PHP5中,對象的代入將成為自動的參照過渡,也就是說, $var2=$var1,兩者指向相同的對象,如果想要同PHP4一樣,帶入copy,那么就會運(yùn)用到導(dǎo)入_clone()方法。 $var2=$var1-_clone();此處clone(
26、)前面是兩個連續(xù)的”_” (這僅僅是類的實體的特性)關(guān)鍵的OOP概念封裝性 封裝性是面向?qū)ο缶幊讨械娜筇匦灾唬庋b性就是把對象的屬性和服務(wù)結(jié)合成一個獨(dú)立的相同單位,并盡可能隱蔽對象的內(nèi)部細(xì)節(jié),包含兩個含義:1.把對象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個不可分割的獨(dú)立單位(即對象)。2.信息隱蔽,即盡可能隱蔽對象的內(nèi)部細(xì)節(jié),對外形成一個邊界或者說形成一道屏障,只保留有限的對外接口使之與外部發(fā)生聯(lián)系。封裝的原則在軟件上的反映是:要求使對象以外的部分不能隨意存取對象的內(nèi)部數(shù)據(jù)(屬性),從而有效的避免了外部錯誤對它的交叉感染,使軟件錯誤能夠局部化,大大減少查錯和排錯的難度。 用個實例來說明吧,
27、假如某個人的對象中有年齡和工資等屬性,像這樣個人隱私的屬性是不想讓其它人隨意就能獲得到的,如果你不使用封裝,那么別人想知道就能得到,但是如果你封裝上之后別人就沒有辦法獲得封裝的屬性,除非你自己把它說出去,否則別人沒有辦法得到。 再比如說,個人電腦都有一個密碼,不想讓其它人隨意的登陸,在你的電腦里面拷貝和粘貼。還有就是像人這個對象,身高和年齡的屬性,只能是自己來增漲,不可以讓別人隨意的賦值等等。關(guān)鍵的OOP概念使用private這個關(guān)鍵字來對屬性和方法進(jìn)行封裝: 原來的成員: var $name; /聲明人的姓名 var $sex; /聲明人的性別 var $age; /聲明人的年齡 funct
28、ion run().改成封裝的形式: private $name; /把人的姓名使用private關(guān)鍵字進(jìn)行封裝 private $sex; /把人的性別使用private關(guān)鍵字進(jìn)行封裝 private $age; /把人的年齡使用private關(guān)鍵字進(jìn)行封裝 private function run() /把人的走路方法使用private關(guān)鍵字進(jìn)行封裝注意:只要是成員屬性前面有其它的關(guān)鍵字就要去掉原有的關(guān)鍵字“var”。 關(guān)鍵的OOP概念通過private就可以把人的成員(成員屬性和成員方法)封裝上了。封裝上的成員就不能被類外面直接訪問了,只有對象內(nèi)部自己可以訪問;下面的代碼會產(chǎn)生錯誤:cl
29、ass Person/下面是人的成員屬性private $name; /人的名子,被private封裝上了private $sex; /人的性別, 被private封裝上了private $age; /人的年齡, 被private封裝上了/這個人可以說話的方法function say()echo 我的名子叫:.$this-name. 性別:.$this-sex. 我的年齡是:.$this-age.;/這個人可以走路的方法, 被private封裝上了private function run()echo 這個人在走路;關(guān)鍵的OOP概念/實例化一個人的實例對象$p1=new Person();/試圖
30、去給私有的屬性賦值, 結(jié)果會發(fā)生錯誤$p1-name=張三;$p1-sex=男;$p1-age=20;/試圖去打印私有的屬性, 結(jié)果會發(fā)生錯誤echo $p1-name.”;echo $p1-sex.”;echo $p1-age.”/試圖去打印私有的成員方法, 結(jié)果會發(fā)生錯誤$p1-run();輸出結(jié)果為:Fatal error: Cannot access private property Person:$nameFatal error: Cannot access private property Person:$sexFatal error: Cannot access private
31、property Person:$ageFatal error: Cannot access private property Person:$nameFatal error: Call to private method Person:run() from context 關(guān)鍵的OOP概念從上面的實例可以看到,私有的成員是不能被外部訪問的,因為私有成員只能在本對象內(nèi)部自己訪問,比如,$p1這個對象自己想把他的私有屬性說出去,在say()這個方法里面訪問了私有屬性,這樣是可以。(沒有加任何訪問控制,默認(rèn)的是public的,任何地方都可以訪問)/這個人可以說話的方法, 說出自己的私有屬性,在這里
32、也可以訪問私有方法 function say() echo “我的名字叫:.$this-name. 性別:.$this-sex. 我的年齡是:.$this-age.; /在這里也可以訪問私有方法 /$this-run(); 因為成員方法say()是公有的,所以我們在類的外部調(diào)用say()方法是可以的,改變上面的代碼;關(guān)鍵的OOP概念class Person/下面是人的成員屬性private $name; /人的名子,被private封裝上了private $sex; /人的性別, 被private封裝上了private $age; /人的年齡, 被private封裝上了/定義一個構(gòu)造方法參數(shù)為
33、私有的屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值function _construct($name, $sex, $age)/通過構(gòu)造方法傳進(jìn)來的$name給私有成員屬性$this-name賦初使值$this-name=$name;/通過構(gòu)造方法傳進(jìn)來的$sex給私有成員屬性$this-sex賦初使值$this-sex=$sex;/通過構(gòu)造方法傳進(jìn)來的$age給私有成員屬性$this-age賦初使值$this-age=$age;/這個人可以說話的方法, 說出自己的私有屬性,在這里也可以訪問私有方法function say()echo 我的名子叫:.$this-name. 性別:.$
34、this-sex. 我的年齡是:.$this-age.;關(guān)鍵的OOP概念/通過構(gòu)造方法創(chuàng)建3個對象$p1、p2、$p3,分別傳入三個不同的實參為姓名、性別和年齡$p1=new Person(“張三”,”男”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面訪問$p1對象中的說話方法$p1-say();/下面訪問$p2對象中的說話方法$p2-say();/下面訪問$p3對象中的說話方法$p3-say();輸出結(jié)果為:我的名字叫:張三性別:男我的年齡是:20 我的名字叫:李四性別:女我的年齡是:30 我的名字叫:王
35、五性別:男我的年齡是:40關(guān)鍵的OOP概念因為構(gòu)造方法是默認(rèn)的公有方法(構(gòu)造方法不要設(shè)置成私有的),所以在類的外面可以訪問到,這樣就可以使用構(gòu)造方法創(chuàng)建對象,另外構(gòu)造方法也是類里面的函數(shù),所以可以用構(gòu)造方法給私有的屬性賦初值。Say()的方法是默認(rèn)公有的,所以在外面也可以訪問的到,說出他自己的私有屬性。 從上面的例子中我們可以看到,私有的成員只能在類的內(nèi)部使用,不能被類外部直接來存取,但是在類的內(nèi)部是有權(quán)限訪問的,所以有時候我們需要在類的外面給私有屬性賦值和讀取出來,也就是給類的外部提供一些可以存取的接口,上例中構(gòu)造方法就是一種賦值的形式,但是構(gòu)造方法只是在創(chuàng)建對象的時候賦值,如果我們已經(jīng)有一
36、個存在的對象了,想對這個存在的對象賦值,這個時候,如果你還使用構(gòu)造方法傳值的形式傳值,那么就創(chuàng)建了一個新的對象,并不是這個已存在的對象了。所以我們要對私有的屬性做一些可以被外部存取的接口,目的就是可以在對象存在的情況下,改變和存取屬性的值,但要注意,只有需要讓外部改變的屬性才這樣做,不想讓外面訪問的屬性是不做這樣的接口的,這樣就能達(dá)到封裝的目的,所有的功能都是對象自己來完成,給外面提供盡量少的操作。關(guān)鍵的OOP概念如果給類外部提供接口,可以為私有屬性在類外部提供設(shè)置方法和獲取方法,來操作私有屬性.例如 prvate $age; /私有的屬性年齡function setAge($age) /為外
37、部提供一個公有設(shè)置年齡的方法if($age130) /在給屬性賦值的時候,為了避免非法值設(shè)置給屬性return;$this-age=$age;function getAge() /為外部提供一個公有獲取年齡的方法return($this-age);上面的方法是為一個成員屬性設(shè)置和獲取值,當(dāng)然你也可以為每個屬性用同樣的方法對其進(jìn)行賦值和取值的操作,完成在類外部的存取工作。 關(guān)鍵的OOP概念_set() _get() 方法的應(yīng)用 一般來說,總是把類的屬性定義為private,這更符合現(xiàn)實的邏輯。但是,對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預(yù)定義了兩個函數(shù)“_get()”和“_set
38、()”來獲取和賦值其屬性,以及檢查屬性的“_isset()”和刪除屬性的方法“_unset()”。 上一節(jié)中,我們?yōu)槊總€屬性做了設(shè)置和獲取的方法,在PHP5中給我們提供了專門為屬性設(shè)置值和獲取值的方法,“_set()”和“_get()”這兩個方法,這兩個方法不是默認(rèn)存在的,而是我們手工添加到類里面去的,像構(gòu)造方法(_construct()一樣, 類里面添加了才會存在,可以按下面的方式來添加這兩個方法,當(dāng)然也可以按個人的風(fēng)格來添加: /_get()方法用來獲取私有屬性private function _get($property_name)if(isset($this-$property_nam
39、e) return($this-$property_name);else return(NULL);關(guān)鍵的OOP概念/_set()方法用來設(shè)置私有屬性 private function _set($property_name, $value) $this-$property_name = $value; _get()方法:這個方法用來獲取私有成員屬性值的,有一個參數(shù),參數(shù)傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用我們手工的去調(diào)用,因為我們也可以把這個方法做成私有的方法,是在直接獲取私有屬性的時候?qū)ο笞詣诱{(diào)用的。因為私有屬性已經(jīng)被封裝上了,是不能直接獲取值的(比如:“echo
40、$p1-name”這樣直接獲取是錯誤的),但是如果你在類里面加上了這個方法,在使用“echo $p1-name”這樣的語句直接獲取值的時候就會自動調(diào)用_get($property_name)方法,將屬性name傳給參數(shù)$property_name,通過這個方法的內(nèi)部執(zhí)行,返回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,對象本身就不會去自動調(diào)用這個方法。 _set()方法:這個方法用來為私有成員屬性設(shè)置值的,有兩個參數(shù),第一個參數(shù)為你要為設(shè)置值的屬性名,第二個參數(shù)是要給屬性設(shè)置的值,沒有返回值。這個方法同樣不用我們手工去調(diào)用,它也可以做成私有的,是在直接設(shè)置私有屬性值的時候自動調(diào)用的,同
41、樣屬性私有的已經(jīng)被封裝上了,如果沒有_set()這個方法,是不允許的,比如:$this-name=zhangsan, 這樣會出錯,但是如果你在類里面加上了_set($property_name, $value)這個方法,在直接給私有屬性賦值的時候,就會自動調(diào)用它,把屬性比如name傳給$property_name, 把要賦的值“zhangsan”傳給$value,通過這個方法的執(zhí)行,達(dá)到賦值的目的。如果成員屬性不封裝成私有的,對象本身就不會去自動調(diào)用這個方法。為了不傳入非法的值,還可以在這個方法給做一下判斷。代碼如下: 關(guān)鍵的OOP概念?phpclass Person/下面是人的成員屬性, 都
42、是封裝的私有成員private $name; /人的名子private $sex; /人的性別private $age; /人的年齡/_get()方法用來獲取私有屬性private function _get($property_name)echo 在直接獲取私有屬性值的時候,自動調(diào)用了這個_get()方法;if(isset($this-$property_name) return($this-$property_name);else return(NULL);關(guān)鍵的OOP概念/_set()方法用來設(shè)置私有屬性 private function _set($property_name, $va
43、lue) echo 在直接設(shè)置私有屬性值的時候,自動調(diào)用了這個_set()方法為私有屬性賦值; $this-$property_name = $value; $p1=new Person(); /直接為私有屬性賦值的操作, 會自動調(diào)用_set()方法進(jìn)行賦值 $p1-name=張三; $p1-sex=男; $p1-age=20; /直接獲取私有屬性的值, 會自動調(diào)用_get()方法,返回成員屬性的值 echo 姓名:.$p1-name.; echo 性別:.$p1-sex.; echo 年齡:.$p1-關(guān)鍵的OOP概念程序執(zhí)行結(jié)果: 在直接設(shè)置私有屬性值的時候,自動調(diào)用了這個_set()方法為
44、私有屬性賦值在直接設(shè)置私有屬性值的時候,自動調(diào)用了這個_set()方法為私有屬性賦值在直接設(shè)置私有屬性值的時候,自動調(diào)用了這個_set()方法為私有屬性賦值在直接獲取私有屬性值的時候,自動調(diào)用了這個_get()方法姓名:張三在直接獲取私有屬性值的時候,自動調(diào)用了這個_get()方法性別:男在直接獲取私有屬性值的時候,自動調(diào)用了這個_get()方法年齡:20以上代碼如果不加上_get()和_set()方法,程序就會出錯,因為不能在類的外部操作私有成員,而上面的代碼是通過自動調(diào)用_get()和_set()方法來幫助我們直接存取封裝的私有成員的。 關(guān)鍵的OOP概念對象的成員屬性設(shè)置方法總結(jié)方法舉例評
45、價1類成員屬性為Pulic通過類引用方式來設(shè)置數(shù)據(jù)成員 $p1-name=”張三”;2類成員屬性為Private通過自動調(diào)用_set()方法 private function _set($property_name, $value) $this-$property_name = $value; $p1-name=張三;3類成員屬性為Private通過構(gòu)造方法傳進(jìn)來的變量來賦初始值 function _construct($name) $this-name=$name; $p1=new Person(“張三”);4類成員屬性為Private設(shè)置方法set()來賦值function setName
46、($name) $this-name=$ name; $p1-setName(“張三”);關(guān)鍵的OOP概念對象的成員屬性獲取方法總結(jié)方法舉例評價1類成員屬性為Pulic通過類引用方式來獲取數(shù)據(jù)成員 $p1-name;2類成員屬性為Private通過自動調(diào)用_get()方法 private function _get($property_name,) return($this-$property_name); $p1-name;3類成員屬性為Private設(shè)置方法 get()來獲得function getName() return($this-$name); $p1-getName( );關(guān)鍵的
47、OOP概念類繼承繼承在PHP中很容易實現(xiàn),只要使用extend關(guān)鍵字 Class Employee private $name# Define a setter for the private $name member. function setName($name) if ($name = “” ) echo “Name cannot be blank1”; else $this-name = $name; #Define a getter for the private $name memberFunction getName( ) return “My name is “.$this-n
48、ame.” ; # end Employee class#Define an Executive class that inherits from EmployeeClass Executive extends Employee#Define a method unique to Employee function pillageCompany( ) echo “Im selling company assets to finance my yacht!”; #end Executive class關(guān)鍵的OOP概念類繼承# Creat a new Executive object$exec =
49、 new Executive ();#Call the setName() method,defined in the Employee class$exec-setName(“Richard”);#Call the getName() methodecho $exec-getName();#Call the pillageCompany() method$exec-pillageCompany();Result:My name is Richard.Im selling company assets to finance my yacht!關(guān)鍵的OOP概念訪問的修飾符在PHP5中,同C#,J
50、AVA一樣,導(dǎo)入了public,private,protected三個等級的訪問限制,使得類的設(shè)計者,能夠?qū)傩院头椒ǖ氖褂梅椒ㄟM(jìn)行限定,以下是各種訪問的限制Public:可以自由的在類的內(nèi)外任何地方進(jìn)行參照、變更。Private:只能在類的方法中進(jìn)行參照、變更。Protected:能夠在這個類以及繼承了這個類的另一個類的方法中進(jìn)行參照、變更。另外,在繼承的類中,能夠?qū)懭朐L問指定。關(guān)鍵的OOP概念訪問的修飾符Class Hoge1Private $var1;Protected $var2=B;Protected $var3; Function setLower ( ) $this-var1=a
51、; $this-var2=b; $this-var3=c; Function var1Return $this-var1; Function var2Return $this-var2; Function var2Return $this-var2; 關(guān)鍵的OOP概念訪問的修飾符在這個類中,帶有$var1、$var2、$var3三個屬性,其中$var1是private,$var2、$var3是protected.在此處PHP代碼-$hoge = new Hoge1();Echo “var1” .$hoge-var1. “n”;-如果嘗試訪問不允許從外部訪問的private屬性,就會出現(xiàn)錯誤:F
52、atal error: Cannot access private property Person:$ var1;對于protected 的$var2,$var3也是一樣。關(guān)鍵的OOP概念訪問的修飾符但是因為$hoge的方法是沒有private和protected的,所以下面的代碼能夠正常運(yùn)行,返回內(nèi)部私有和保護(hù)變量的值。PHP代碼-$hoge-setLower();Echo var1: . $hoge-var1. “n”;Echo var2: . $hoge-var2. “n”;Echo var3: . $hoge-var3. “n”;Result:var1: avar2: bvar3: c
53、關(guān)鍵的OOP概念訪問的修飾符其次,為了能夠看到protected的屬性的狀態(tài),我們試著創(chuàng)造了繼承了Hoge1的類Hoge2.PHP代碼-Class Hoge2 extend Hoge1 Public $var3=3; function d_var1( ) return $this-var1; function d_var2( ) return $this-var2; function d_var3( ) return $this-var3; # end Executive class-關(guān)鍵的OOP概念訪問的修飾符在類Hoge2中,只有$var3被聲明為public。在屬性是protected的
54、情況下,從子類進(jìn)行訪問有何種限制,是由子類的屬性聲明決定的。在Hoge2中,因為$var3被聲明是public,因此無論是從何處都可以訪問Hoge2的$var3(實體是Hoge1的$var3).因為$var1在Hoge1中是private,因此,在Hoge2子類中Hoge1的$var1不會被繼承,而在Hoge2中有可能會做出名為$var1的屬性,因此,必須要明確區(qū)分Hoge1:$var1和Hoge2:$var1.PHP代碼-$hoge = new Hoge2.echo var1: . $hoge-var1 .n; /var1:/ echo var2: . $hoge-var2 .n; /Err
55、orecho var3: . $hoge-var3 .n; /var3:3echo var1: . $hoge-d_var1() .“n”; /var1:echo var2: . $hoge-d_var2() .“n”; /var2:Becho var3: . $hoge-d_var3() .n; /var3:3-$hoge-var1是與Hoge1:var1沒有關(guān)系的變量,因此不會有任何顯示,因為var2有protected訪問限制,所以如果不通過method就直接訪問$var2,就會出現(xiàn)致命錯誤。 關(guān)鍵的OOP概念訪問的修飾符與上述相同,此處也分為private,public,protected三種。Public:能夠從任何地方調(diào)用Private:只能從這個類的method內(nèi)調(diào)用Protected:只能從這個類以及subclass的met
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高考語文復(fù)習(xí)知識清單第2章文學(xué)類文本閱讀(一)小說專題01賞析小說故事情節(jié)(學(xué)生版+解析)
- 臍橙樹打藥安全責(zé)任書承包合同(2篇)
- 南京工業(yè)大學(xué)浦江學(xué)院《專業(yè)綜合實訓(xùn)(通信工程)》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《審計學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 多變的紙條說課稿
- 小石城7#樓 施工組織設(shè)計
- 南京工業(yè)大學(xué)浦江學(xué)院《建筑給水排水工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 《小石潭記》說課稿
- 小學(xué)音樂面試《哦十分鐘》說課稿
- 南京工業(yè)大學(xué)《中日比較文學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 醫(yī)院培訓(xùn)課件:《ECMO概述及其護(hù)理》
- 餐飲門店運(yùn)營管理手冊
- 《生物試卷分析》課件
- 反賄賂與反腐敗的危機(jī)防控
- 學(xué)校食堂維修合同書
- 護(hù)士如何處理病患的溝通和沖突問題
- 泵與泵站知識點(diǎn)總結(jié)
- 輪對-輪對的故障與檢修限度(車輛構(gòu)造檢修課件)
- 2023年永生花行業(yè)分析報告及未來五至十年行業(yè)發(fā)展報告
- 12、口腔科診療指南及技術(shù)操作規(guī)范
- 人居環(huán)境科學(xué)講義
評論
0/150
提交評論