《PHP初體驗(yàn)(一)》要點(diǎn):
本文介紹了PHP初體驗(yàn)(一),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
提筆寫(xiě)初體驗(yàn)總不知道從何說(shuō)起,直接聊PHP中的函數(shù)、PHP網(wǎng)絡(luò)技術(shù)、數(shù)據(jù)庫(kù)操作、PHP模板等感覺(jué)又不是初體驗(yàn).最后還是決定從PHP的面向?qū)ο蟆HP的魔術(shù)辦法、PHP的反射、PHP中的異常和錯(cuò)誤這4個(gè)方面簡(jiǎn)單介紹一下.
PHP面向工具的“形”與“本”
這里我們就不給面向?qū)ο笙露x了,不外我們還是要說(shuō)一下類(lèi)和對(duì)象的.類(lèi)是對(duì)象的抽象組織,對(duì)象是類(lèi)的具體存在.接下來(lái)我們就拿PHP為例,來(lái)探討一下對(duì)象的“形”與“本”的問(wèn)題.
在PHP中,每個(gè)類(lèi)的定義都是以關(guān)鍵字class開(kāi)頭,后面是類(lèi)名和一對(duì)花括號(hào),括號(hào)中包含類(lèi)成員和辦法的定義.如下是一個(gè)簡(jiǎn)單類(lèi)的定義:
當(dāng)把類(lèi)對(duì)象序列化輸出時(shí),可以看出類(lèi)對(duì)象在存儲(chǔ)時(shí)類(lèi)似于數(shù)組的形式.那么類(lèi)對(duì)象與數(shù)組從本色上又有什么區(qū)別與聯(lián)系呢?接下來(lái)從對(duì)象“本”來(lái)分析一下PHP對(duì)對(duì)象的底層實(shí)現(xiàn).如下是PHP源碼中對(duì)變量的定義:
通過(guò)上面的代碼我們也對(duì)PHP如何存儲(chǔ)對(duì)象有了初步的認(rèn)識(shí),那對(duì)象與數(shù)組又是什么關(guān)系呢?通過(guò)PHP的源碼可得,zvalue_object結(jié)構(gòu)中有一個(gè)HashTable的類(lèi)型,它便是存儲(chǔ)數(shù)組的.PHP對(duì)象的結(jié)構(gòu)體中不僅有HashTable(用于存儲(chǔ)類(lèi)對(duì)象特有的屬性),而且還有對(duì)象所屬類(lèi)的入口等,如下是PHP對(duì)象的組成:
其中PHP源碼中zend_class_entry結(jié)構(gòu)體中存儲(chǔ)的就是類(lèi)的指針,該結(jié)構(gòu)體中包含類(lèi)常量、靜態(tài)屬性、標(biāo)準(zhǔn)辦法、魔術(shù)辦法、自定義辦法等.而屬性數(shù)組存儲(chǔ)的是類(lèi)對(duì)象的屬性.接下來(lái)我們還是以如上的Person類(lèi)為例,談一談對(duì)象與數(shù)組:
PHP中的魔術(shù)辦法
可能細(xì)心的你在對(duì)象組成的那張圖中看到了魔術(shù)辦法,但是上一節(jié)中并沒(méi)有對(duì)zend_class_entry中的內(nèi)容做任何介紹.那么什么又是魔術(shù)辦法呢?魔術(shù)辦法就是以兩個(gè)下劃線“__”開(kāi)頭、具有一些特殊作用的辦法.其實(shí)如上的Person類(lèi)中,我們不經(jīng)意間就使用了魔術(shù)辦法__construct(),這個(gè)魔術(shù)辦法就是構(gòu)造辦法.用于在創(chuàng)建類(lèi)對(duì)象時(shí)對(duì)屬性進(jìn)行賦值.接下來(lái)我們將介紹幾個(gè)常見(jiàn)的魔術(shù)辦法讓大家對(duì)魔術(shù)辦法有個(gè)初步了解.
__sleep():該魔術(shù)辦法是在執(zhí)行serialize()辦法完成前被調(diào)用,該辦法可以用來(lái)關(guān)閉對(duì)象可能具有的任何數(shù)據(jù)庫(kù)連接、加密需要序列化對(duì)象屬性的值、指定僅序列化對(duì)象的某些屬性等等.
__wakeup():該魔術(shù)辦法是在執(zhí)行unserialize()辦法完成前被調(diào)用,該辦法可以用來(lái)建立對(duì)象可能的數(shù)據(jù)庫(kù)連接、解密序列化對(duì)象屬性的值等等.
3.__construct():類(lèi)的構(gòu)造辦法,類(lèi)對(duì)象在創(chuàng)建時(shí)會(huì)首先調(diào)用該辦法,因此該辦法中可以做一些類(lèi)對(duì)象創(chuàng)建前的初始化工作.
4.__destruct():類(lèi)的析構(gòu)辦法,當(dāng)類(lèi)對(duì)象在銷(xiāo)毀時(shí)會(huì)調(diào)用該辦法.
5.__get()和__set()方法,這兩個(gè)方法主要是實(shí)現(xiàn)了可以在類(lèi)的外部通過(guò)對(duì)象直接拜訪類(lèi)的私有屬性,還可以增加類(lèi)中沒(méi)有定義的屬性,如給$person對(duì)象增加marriage屬性,只需$person->marriage="married"即可.
6.__call()和__callStatic():當(dāng)類(lèi)對(duì)象調(diào)用的辦法不存在而且類(lèi)中定義了__call()辦法時(shí),則會(huì)自動(dòng)調(diào)用類(lèi)的__call(),當(dāng)類(lèi)調(diào)用靜態(tài)辦法不存在而且類(lèi)中定義了辦法__callStatic()時(shí),則會(huì)自動(dòng)調(diào)用__callStatic()辦法.
7.__toString()辦法,該辦法主要用于格式化打印一個(gè)對(duì)象,該辦法的設(shè)計(jì)原型來(lái)源于Java.只有類(lèi)中實(shí)現(xiàn)了__toString()辦法才可以通過(guò)echo直接打印該對(duì)象.
關(guān)于PHP的魔術(shù)辦法我們就簡(jiǎn)單介紹到這里,由上我們可以看出從構(gòu)造辦法上,PHP相比于還稍有欠缺,但PHP中有__set()和__get(),使得動(dòng)態(tài)增加對(duì)象的屬性字段變得更加方便,而對(duì)于Java來(lái)說(shuō)要實(shí)現(xiàn)類(lèi)似的效果,就不得不借助反射API或直接修改編譯后字節(jié)碼的方式實(shí)現(xiàn)了.Java中有反射機(jī)制,那么PHP中呢?接下來(lái)讓我們來(lái)看一看PHP中的反射實(shí)現(xiàn).
更多干貨請(qǐng)存眷:
優(yōu)待業(yè)500萬(wàn)陽(yáng)光待業(yè)基金:
http://www.ujiuye.com/zt/jyfc/?wt.bd=fq37300
優(yōu)待業(yè)官網(wǎng):http://www.ujiuye.com/?wt.bd=fq37300
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP初體驗(yàn)(一)》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7168.html