十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章給大家分享的是有關(guān)php面向?qū)ο蠡A(chǔ)的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
面向?qū)ο蟛┐缶?,對于從未接觸過得的人,會覺得一頭霧水。
學(xué)習(xí)的資料很多,但大多比較抽象,所以我用經(jīng)典的游戲-星際爭霸來討論P(yáng)HP面向?qū)ο蟆?br/>現(xiàn)在假設(shè)我們來用PHP開發(fā)星際爭霸,從而接觸PHP面向?qū)ο蟆?br/>注意,為了便于學(xué)習(xí),除了特殊說明,否則各部分代碼之間沒有關(guān)聯(lián)。而且同一件事情往往用的是不同的代碼。
另外我也不去考證各個兵種的屬性數(shù)字,僅僅用來說明。
如果玩家制造了一個機(jī)槍兵,那么我們怎么表示他呢,因?yàn)槊總€機(jī)槍兵有幾個基本的數(shù)據(jù)要記錄:剩余的血,殺敵數(shù)量,攻擊力等等。
我們可以用一個數(shù)組來記錄一個機(jī)槍兵剩余的血和殺敵數(shù)量,因?yàn)檫@對于每個機(jī)槍兵是獨(dú)立的。
但攻擊力比較麻煩,因?yàn)榻?jīng)過升級,攻擊力會增加,這就必須要找出所有表示機(jī)槍兵的數(shù)組,然后進(jìn)行修改,非常麻煩。
從這里我們可以看出一件事情,首先每個機(jī)槍兵有獨(dú)立的數(shù)據(jù)需要記錄和修改,比如剩余的血。同時他們有相同的數(shù)據(jù)需要共用,比如攻擊力。
這時候面向?qū)ο缶湍軒蜕衔覀兊拿α恕?/p>
我們先來處理一部分問題,也就是每個機(jī)槍兵獨(dú)有的數(shù)據(jù)。
這叫做類,我們建立了一個表示所有機(jī)槍兵的類marine,這里面保留了需要每個兵獨(dú)有的數(shù)據(jù),比如上面代碼里的剩余的血。
接下來我們來使用對象,也就是每個機(jī)槍兵:
通過new后面加一個類的名字和括號,我們新建了一個機(jī)槍兵$m1,$m1被叫做類marine的對象,我們可以把它想象成一個特殊變量,只不過里面保存了多個數(shù)據(jù)。
如果需要使用或者操作某個機(jī)槍兵的血(對象的屬性),只要用$m1->blood來表示就可以了:echo $m1->blood;//輸出機(jī)槍兵$m1剩余的血
我們再建立一個機(jī)槍兵
如果此時$m1被敵人攻擊過了,還剩下10個血。而$m2沒受過攻擊:
blood;//結(jié)果是10 echo $m2->blood;//結(jié)果是50 ?>
使用對象可以很簡單的保存每個機(jī)槍兵的血,不會互相影響。
如果機(jī)槍兵$m1攻擊敵人的時候,可以這樣使用對象的方法:
attack($z1);//假設(shè)攻擊的是某個小狗的對象$z1 ?>
不同的類內(nèi)可以用同名的函數(shù),比如小狗的類Zergling里面也可以有一個函數(shù)attack
要注意的是,從PHP5開始,無論在哪里改變一個對象的屬性,都能改變它。比如上面一個小狗對象被作為參數(shù)傳入機(jī)槍兵的attack函數(shù),執(zhí)行函數(shù)之后這個小狗對象的血減少了,這和一般的函數(shù)不同。但這是很直觀的,如果一個小狗被攻擊了,它的血就應(yīng)該減少。
每次我們新建一個機(jī)槍兵的時候,總?cè)丝趹?yīng)該加1,如果一個機(jī)槍兵被殺,人口應(yīng)該減少1。
可以通過構(gòu)造函數(shù)和析構(gòu)函數(shù)來自動處理:
在一個類中,名字為__construct的函數(shù)叫做構(gòu)造函數(shù),每次new新建一個類的對象的時候就會執(zhí)行:
在一個類中,名字為__destruct的函數(shù)叫做析構(gòu)函數(shù),每次銷毀一個類的對象的時候就會執(zhí)行:
機(jī)槍兵的攻擊力是屬于所有機(jī)槍兵對象,每個機(jī)槍兵的攻擊力都是一樣的,如果升級,應(yīng)該一起變化。
這就用到static,表示靜態(tài):
blood表示敵人對象的血屬性 $enemy->blood -= self::$attackNumber; } } ?>
靜態(tài)屬性表示類所有的對象都共享的屬性,一旦改變,所有的對象都跟著變化。
靜態(tài)屬性用static開頭,比如上面的static $attackNumber。
靜態(tài)屬性可以用類直接訪問:
如果類以內(nèi)的函數(shù)訪問,用self::$attackNumber表示本類的$attackNumber屬性
所以如果我們升級了機(jī)槍兵的攻擊力,所有的機(jī)槍兵都受影響,這就是面向?qū)ο蟮暮锰幹唬步鉀Q了我們前面討論的共同數(shù)據(jù)的問題。
函數(shù)也可以是靜態(tài)的,這樣就可以用類直接訪問,不需要新建對象來調(diào)用:
如果科技建筑升級完畢,直接就調(diào)用這個函數(shù):
兵營用來造機(jī)槍兵,坦克房用來制造坦克,他們都是建筑,但是卻有很多不同,如果用一個類“建筑”來表示,很困難。
但我們要保留他們的共性,比如都能飛行,不希望飛行的代碼在各個類重復(fù)寫,又要讓他們能各自獨(dú)立的生產(chǎn)不同的東西。
所以我們可以用繼承來處理,繼承表示父子關(guān)系,被繼承的叫父類,繼承的叫子類。用extends表示繼承
接下來,我們看看繼承產(chǎn)生的效果:
fly(); //而他要制造機(jī)槍兵的時候: $mb1->createMarine(); ?>
同樣是繼承建筑類的坦克房類,就無法制造機(jī)槍兵,因?yàn)檫@是兵營類的個性。
如果在子類中的函數(shù)調(diào)用父類的函數(shù),要使用parent,比如parent::fly()
注意,一個類只能有一個父類,PHP不允許多重繼承,也就是說一個孩子只能有一個爹,一個爹可以有N個孩子!
如果用$attackNumber = 10表示屬性的話,系統(tǒng)默認(rèn)是public $attackNumber = 10,所以建議這樣寫:
public表示這個屬性是公共的,也就是在任何地方都可以訪問和操作的。
但這就存在一些問題,如果有玩家知道了類marine的一些代碼結(jié)構(gòu),那他做個簡單的補(bǔ)丁程序,運(yùn)行的時候加載上去:
這樣的話,他的機(jī)槍兵有10000的攻擊力,呵呵,這樣的話,誰打得過他!
為此我們要用private,表示這個屬性只有類里面的函數(shù)才能訪問:
這樣一來,只有升級才能改變機(jī)槍兵的攻擊力。
但是現(xiàn)在往往是團(tuán)隊開發(fā),而且很多用到類的繼承,如果private的話,子類就無法訪問了,但又不希望隨便都可以修改某些屬性。
那么可以用protected,protected的屬性可以被子類的函數(shù)訪問。
如果我們把地面部隊作為一個類,讓機(jī)槍兵類來繼承他,這時候如果地面部隊類和機(jī)槍兵類里面都定義了攻擊力$attackNumber,那么每個兵的攻擊力就決定于機(jī)槍兵類,而不是地面部隊。這就叫做重載。
attackNumber;//顯示攻擊力為10 ?>
重載也可以用于函數(shù),子類的函數(shù)如果和父類函數(shù)同名,除非另行說明,否則子類的對象默認(rèn)調(diào)用子類內(nèi)的函數(shù)。
比如人族的鬼兵類ghost和神族類的黑暗圣堂類(隱刀),都是隱形兵種,但是鬼兵隱形的時候會減少能量,黑暗圣堂根本沒有能量屬性。
如果我們把隱形能力作為父類,鬼兵類ghost和神族類的黑暗圣堂類DarkTemplar來繼承它,同時實(shí)現(xiàn)不同的隱形代碼:
energy -= 25; } } //黑暗圣堂類 class DarkTemplar extends concealAbility { //這個函數(shù)表示隱形的運(yùn)行代碼 function conceal() { //隱形的運(yùn)行代碼,不影響能量 } } //新建一個鬼兵 $g1 = new ghost(); //顯示能量為150 echo $g1->energy; //鬼兵隱形 $g1->conceal(); //顯示能量為125 echo $g1->energy; //新建一個黑暗圣堂 $d1 = new DarkTemplar(); //黑暗圣堂隱形,他沒有能量屬性 $g1->conceal(); ?>
PHP不允許多重繼承,那么有些問題就難辦了。
假如為了規(guī)范處理,我們把隱形的能力建立一個類,然后把飛行能力放一個類,那么人族的偵察機(jī)怎么處理?不能繼承兩個類!
那我們不用繼承也行,但是開發(fā)組的其他人一旦涉及到偵察機(jī),要把長長的代碼讀一遍嗎?有沒有可能知道類的所有方法的簡要描述?
可以用到接口interface,一個類可以執(zhí)行(繼承)多個接口,接口中定義的函數(shù)不能有函數(shù)體,執(zhí)行接口的類必須將這些函數(shù)完整定義。
這樣我們知道偵察機(jī)實(shí)現(xiàn)了飛行能力接口,必然有接口里面描述的飛行方法://隱形能力的接口
感謝各位的閱讀!關(guān)于“php面向?qū)ο蠡A(chǔ)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!