摘要:二面向?qū)ο笥惺裁刺卣髅嫦驅(qū)ο蟮闹饕卣饔谐橄罄^承封裝和多態(tài)。析構(gòu)函數(shù)析構(gòu)函數(shù)是在引入的,它的作用與調(diào)用時(shí)機(jī)和構(gòu)造函數(shù)剛好相反,它在對(duì)象被銷(xiāo)毀時(shí)自動(dòng)執(zhí)行。
PHP面試專(zhuān)欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。
PHP中面向?qū)ο蟪?嫉闹R(shí)點(diǎn)有以下7點(diǎn),我將會(huì)從以下幾點(diǎn)進(jìn)行詳細(xì)介紹說(shuō)明,幫助你更好的應(yīng)對(duì)PHP面試??嫉拿嫦?qū)ο笙嚓P(guān)的知識(shí)點(diǎn)和考題。
整個(gè)面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉及的內(nèi)容模塊有:
一、面向?qū)ο笈c面向過(guò)程有什么區(qū)別?
二、面向?qū)ο笥惺裁刺卣鳎?/strong>
三、什么是構(gòu)造函數(shù)和析構(gòu)函數(shù)?
四、面向?qū)ο蟮淖饔糜蚍秶心膸追N?
五、PHP 中魔術(shù)方法有哪些?
六、什么是對(duì)象克???
七、this、self和parent的區(qū)別是什么?
八、抽象類(lèi)與接口有什么區(qū)別與聯(lián)系?
九、PHP面向?qū)ο蟮某?济嬖囶}講解
關(guān)于PHP面向?qū)ο蟮膬?nèi)容將會(huì)被分為三篇文章進(jìn)行講解完整塊內(nèi)容,第一篇主要講解一到四點(diǎn)內(nèi)容,第二篇主要講解五到八的內(nèi)容,第三篇圍繞第九點(diǎn)進(jìn)行講解。
以下正文的內(nèi)容都來(lái)自《PHP程序員面試筆試寶典》書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處:
一、面向?qū)ο笈c面向過(guò)程有什么區(qū)別?面向?qū)ο笫钱?dāng)今軟件開(kāi)發(fā)方法的主流方法之一,它是把數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法放在一起,作為一個(gè)相互依存的整體,即對(duì)象。對(duì)同類(lèi)對(duì)象抽象出其共性,即類(lèi),類(lèi)中的大多數(shù)數(shù)據(jù),只能被本類(lèi)的方法進(jìn)行處理。類(lèi)通過(guò)一個(gè)簡(jiǎn)單的外部接口與外界發(fā)生關(guān)系,對(duì)象與對(duì)象之間通過(guò)消息進(jìn)行通信。程序流程由用戶(hù)在使用中決定。例如,站在抽象的角度,人類(lèi)具有身高、體重、年齡、血型等一些特稱(chēng),人類(lèi)會(huì)勞動(dòng)、會(huì)直立行走、會(huì)吃飯、會(huì)用自己的頭腦去創(chuàng)造工具等這些方法,人類(lèi)僅僅只是一個(gè)抽象的概念,它是不存在的實(shí)體,但是所有具備人類(lèi)這個(gè)群體的屬性與方法的對(duì)象都稱(chēng)為人,這個(gè)對(duì)象人是實(shí)際存在的實(shí)體,每個(gè)人都是人這個(gè)群體的一個(gè)對(duì)象。
而面向過(guò)程是一種以事件為中心的開(kāi)發(fā)方法,就是自頂向下順序執(zhí)行,逐步求精,其程序結(jié)構(gòu)是按功能劃分為若干個(gè)基本模塊,這些模塊形成一個(gè)樹(shù)狀結(jié)構(gòu),各模塊之間的關(guān)系也比較簡(jiǎn)單,在功能上相對(duì)獨(dú)立,每一模塊內(nèi)部一般都是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成,其模塊化實(shí)現(xiàn)的具體方法是使用子程序,而程序流程在寫(xiě)程序時(shí)就已經(jīng)決定。例如五子棋,面向過(guò)程的設(shè)計(jì)思路就是首先分析問(wèn)題的步驟:第一步,開(kāi)始游戲;第二步,黑子先走;第三步,繪制畫(huà)面;第四步,判斷輸贏;第五步,輪到白子;第六步,繪制畫(huà)面;第七步,判斷輸贏;第八步,返回步驟二;第九步,輸出最后結(jié)果。把上面每個(gè)步驟用分別的函數(shù)來(lái)實(shí)現(xiàn),就是一個(gè)面向過(guò)程的開(kāi)發(fā)方法。
具體而言,二者主要有以下幾個(gè)方面的不同之處。
1)出發(fā)點(diǎn)不同。面向?qū)ο笫怯梅铣R?guī)思維方式來(lái)處理客觀世界的問(wèn)題,強(qiáng)調(diào)把問(wèn)題域的要領(lǐng)直接映射到對(duì)象及對(duì)象之間的接口上。而面向過(guò)程方法則不然,它強(qiáng)調(diào)的是過(guò)程的抽象化與模塊化,它是以過(guò)程為中心構(gòu)造或處理客觀世界問(wèn)題的。
2)層次邏輯關(guān)系不同。面向?qū)ο蠓椒▌t是用計(jì)算機(jī)邏輯來(lái)模擬客觀世界中的物理存在,以對(duì)象的集合類(lèi)作為處理問(wèn)題的基本單位,盡可能地使計(jì)算機(jī)世界向客觀世界靠攏,以使問(wèn)題的處理更清晰直接,面向?qū)ο蠓椒ㄊ怯妙?lèi)的層次結(jié)構(gòu)來(lái)體現(xiàn)類(lèi)之間的繼承和發(fā)展。面向過(guò)程方法處理問(wèn)題的基本單位是能清晰準(zhǔn)確地表達(dá)過(guò)程的模塊,用模塊的層次結(jié)構(gòu)概括模塊或模塊間的關(guān)系與功能,把客觀世界的問(wèn)題抽象成計(jì)算機(jī)可以處理的過(guò)程。
3)數(shù)據(jù)處理方式與控制程序方式不同。面向?qū)ο蠓椒▽?shù)據(jù)與對(duì)應(yīng)的代碼封裝成一個(gè)整體,原則上其他對(duì)象不能直接修改其數(shù)據(jù),即對(duì)象的修改只能由自身的成員函數(shù)完成,控制程序方式上是通過(guò)“事件驅(qū)動(dòng)”來(lái)激活和運(yùn)行程序。而面向過(guò)程方法是直接通過(guò)程序來(lái)處理數(shù)據(jù),處理完畢后即可顯示處理結(jié)果,在控制程序方式上是按照設(shè)計(jì)調(diào)用或返回程序,不能自由導(dǎo)航,各模塊之間存在著控制與被控制、調(diào)用與被調(diào)用。
4)分析設(shè)計(jì)與編碼轉(zhuǎn)換方式不同。面向?qū)ο蠓椒ㄘ灤┸浖芷诘姆治?、設(shè)計(jì)及編碼之間是一種平滑過(guò)程,從分析到設(shè)計(jì)再到編碼是采用一致性的模型表示,即實(shí)現(xiàn)的是一種無(wú)縫連接。而面向過(guò)程方法強(qiáng)調(diào)分析、設(shè)計(jì)及編碼之間按規(guī)則進(jìn)行轉(zhuǎn)換,貫穿軟件生命周期的分析、設(shè)計(jì)及編碼之間,實(shí)現(xiàn)的是一種有縫的連接。
面向?qū)ο蟮闹饕卣饔谐橄?、繼承、封裝和多態(tài)。
1)抽象。抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過(guò)程抽象,二是數(shù)據(jù)抽象。
2)繼承。繼承是一種聯(lián)結(jié)類(lèi)的層次模型,并且允許和鼓勵(lì)類(lèi)的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類(lèi)可以從現(xiàn)有的類(lèi)中派生,這個(gè)過(guò)程稱(chēng)為類(lèi)繼承。新類(lèi)繼承了原始類(lèi)的特性,新類(lèi)稱(chēng)為原始類(lèi)的派生類(lèi)(子類(lèi)),而原始類(lèi)稱(chēng)為新類(lèi)的基類(lèi)(父類(lèi))。派生類(lèi)可以從它的基類(lèi)那里繼承方法和實(shí)例變量,并且子類(lèi)可以修改或增加新的方法使之更適合特殊的需要。
3)封裝。封裝是指將客觀事物抽象成類(lèi),每個(gè)類(lèi)對(duì)自身的數(shù)據(jù)和方法實(shí)行保護(hù)。類(lèi)可以把自己的數(shù)據(jù)和方法只讓可信的類(lèi)或者對(duì)象操作,對(duì)不可信的信息進(jìn)行隱藏。
4)多態(tài)。多態(tài)是指允許不同類(lèi)的對(duì)象對(duì)同一消息做出響應(yīng)。多態(tài)包括參數(shù)化多態(tài)和包含多態(tài)。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好地解決了應(yīng)用程序函數(shù)同名問(wèn)題。
自己整理了一篇“PHP和MySQL面試中愛(ài)考的10道題”的文章,關(guān)注公眾號(hào):“琉憶編程庫(kù)”,回復(fù):“10”,我發(fā)給你。
在PHP5之前的版本,構(gòu)造函數(shù)的名字必須與類(lèi)的名字相同,而從PHP5開(kāi)始,開(kāi)發(fā)者可以定義一個(gè)名為_(kāi)_construct的方法作為構(gòu)造函數(shù)。構(gòu)造函數(shù)的作用就是當(dāng)類(lèi)被實(shí)例化的時(shí)候會(huì)被自動(dòng)調(diào)用,因此構(gòu)造函數(shù)主要用于做一些初始化的工作。使用__construct作為構(gòu)造函數(shù)名字的一個(gè)好處是,當(dāng)類(lèi)名修改的時(shí)候,不需要修改構(gòu)造函數(shù)的名字。它的聲明形式為
void __construct ([ mixed $args [, $... ]] )
在C++語(yǔ)言中,子類(lèi)的構(gòu)造函數(shù)會(huì)隱式地調(diào)用父類(lèi)的無(wú)參數(shù)的構(gòu)造函數(shù)。但是在PHP中,子類(lèi)的構(gòu)造函數(shù)不會(huì)隱式地去調(diào)用父類(lèi)的構(gòu)造函數(shù),需要開(kāi)發(fā)者通過(guò)parent::__construct()來(lái)顯式地去調(diào)用父類(lèi)的構(gòu)造函數(shù)。當(dāng)子類(lèi)沒(méi)有定義構(gòu)造函數(shù)的時(shí)候,它會(huì)繼承父類(lèi)的構(gòu)造函數(shù),但前提是父類(lèi)的構(gòu)造函數(shù)不能被定義為private。使用示例如下:
程序的運(yùn)行結(jié)果為
Base constructor
Base constructor
Sub constructor
從上面的講解中可以發(fā)現(xiàn),從PHP5開(kāi)始多了一種構(gòu)造函數(shù)定義的方法。為了實(shí)現(xiàn)不同版本PHP代碼的兼容,在PHP5的類(lèi)中找不到?__construct()?函數(shù)并且也沒(méi)有從父類(lèi)繼承一個(gè)的話,那么它就會(huì)嘗試尋找舊式的構(gòu)造函數(shù)(與類(lèi)同名的函數(shù))。這種兼容的方法存在一個(gè)風(fēng)險(xiǎn):在PHP5之前的版本中開(kāi)發(fā)的類(lèi)中已有一個(gè)名為?__construct()?的方法卻被用于其他用途時(shí),PHP5的類(lèi)會(huì)認(rèn)為這是一個(gè)構(gòu)造函數(shù),從而當(dāng)類(lèi)實(shí)例化時(shí)自動(dòng)執(zhí)行這個(gè)方法。
從 PHP 5.3.3 開(kāi)始,在命名空間中,與類(lèi)名同名的方法不再作為構(gòu)造函數(shù)。這一改變不影響不在命名空間中的類(lèi)。
析構(gòu)函數(shù)是在PHP5引入的,它的作用與調(diào)用時(shí)機(jī)和構(gòu)造函數(shù)剛好相反,它在對(duì)象被銷(xiāo)毀時(shí)自動(dòng)執(zhí)行。析構(gòu)函數(shù)__destruct()結(jié)構(gòu)形式如下:
function __destruct(){ /* 類(lèi)的初始化代碼*/ }?
需要注意的是,析構(gòu)函數(shù)是由系統(tǒng)自動(dòng)調(diào)用的,因此,它不需要參數(shù)。
默認(rèn)情況下,系統(tǒng)僅釋放對(duì)象屬性所占用的內(nèi)存,并不銷(xiāo)毀在對(duì)象內(nèi)部申請(qǐng)的資源(例如,打開(kāi)文件、創(chuàng)建數(shù)據(jù)庫(kù)的連接等),而利用析構(gòu)函數(shù)在使用一個(gè)對(duì)象之后執(zhí)行代碼來(lái)清除這些在對(duì)象內(nèi)部申請(qǐng)的資源(關(guān)閉文件、斷開(kāi)與數(shù)據(jù)庫(kù)的連接)。
與構(gòu)造函數(shù)類(lèi)似,如果想在子類(lèi)中調(diào)用父類(lèi)的析構(gòu)函數(shù),那么需要顯式地調(diào)用:parent::__destruct()。如果子類(lèi)沒(méi)有定義析構(gòu)函數(shù),那么它會(huì)繼承父類(lèi)的析構(gòu)函數(shù)。
當(dāng)對(duì)象不再被引用時(shí),將調(diào)用析構(gòu)函數(shù)。如果要明確地銷(xiāo)毀一個(gè)對(duì)象,那么可以給指向?qū)ο蟮淖兞坎环峙淙魏沃?,通常將變量賦值為NULL或者用unset()函數(shù)。示例代碼如下:
"; } } $p=new des(); /* 實(shí)例化類(lèi) */ echo "程序開(kāi)始
"; unset($p); /* 銷(xiāo)毀變量$p */ echo "程序結(jié)束"; ?>
在PHP5中,類(lèi)的屬性或者方法主要有public、protected和private三種類(lèi)作用域,它們的區(qū)別如下:
1)public(公有類(lèi)型)表示全局,類(lèi)內(nèi)部、外部和子類(lèi)都可以訪問(wèn)。
默認(rèn)的訪問(wèn)權(quán)限為public,也就是說(shuō),如果一個(gè)方法沒(méi)有被public、protected或private修飾,那么它默認(rèn)的作用域?yàn)閜ublic。
2)protected(受保護(hù)類(lèi)型)表示受保護(hù)的,只有本類(lèi)或子類(lèi)可以訪問(wèn)。
在子類(lèi)中,可以通過(guò)self::var或self::method訪問(wèn),也可以通過(guò)parent::method來(lái)調(diào)用父類(lèi)中的方法。
在類(lèi)的實(shí)例化對(duì)象中,不能通過(guò)$obj->var來(lái)訪問(wèn)protected類(lèi)型的方法或?qū)傩浴?br>3)private(私有類(lèi)型)表示私有的,只有本類(lèi)內(nèi)部可以使用。
該類(lèi)型的屬性或方法只能在該類(lèi)中使用,在該類(lèi)的實(shí)例、子類(lèi)、子類(lèi)的實(shí)例中都不能調(diào)用私有類(lèi)型的屬性和方法。
預(yù)告:PHP面試常考內(nèi)容之面向?qū)ο螅?)將于本周三(2019.2-13)更新。
以上內(nèi)容摘自《PHP程序員面試筆試寶典》書(shū)籍,該書(shū)已在天貓、京東、當(dāng)當(dāng)?shù)入娚唐脚_(tái)銷(xiāo)售。
更多PHP相關(guān)的面試知識(shí)、考題可以關(guān)注公眾號(hào)獲?。?strong>琉憶編程庫(kù)
對(duì)本文有什么問(wèn)題或建議都可以進(jìn)行留言,將不斷完善追求極致,感謝你們的支持。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30088.html
摘要:面試專(zhuān)欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試??純?nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?。面向?qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專(zhuān)欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...
摘要:繼上一篇面試??純?nèi)容之面向?qū)ο蟀l(fā)表后,今天更新,需要的可以直接點(diǎn)擊文字進(jìn)行跳轉(zhuǎn)獲取。析構(gòu)函數(shù),當(dāng)對(duì)象被銷(xiāo)毀時(shí)調(diào)用。 PHP面試專(zhuān)欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新(2),需要(1)的可以直接點(diǎn)擊文字進(jìn)行跳轉(zhuǎn)獲取。整個(gè)面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉及的內(nèi)容模塊有: 一、面向?qū)ο笈c面向過(guò)程有什么區(qū)別?二、面向?qū)?..
摘要:而在面試過(guò)程中,也是經(jīng)常會(huì)遇到的,所以,無(wú)論是面試準(zhǔn)備還是日常開(kāi)發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點(diǎn)。根據(jù)二分點(diǎn)的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無(wú)用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進(jìn)入...
摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開(kāi)源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮?zhuān)題后,發(fā)布的第二個(gè)專(zhuān)題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...
摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書(shū)籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開(kāi)源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮?zhuān)題后,發(fā)布的第二個(gè)專(zhuān)題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...
閱讀 3621·2021-11-24 10:25
閱讀 2546·2021-11-24 09:38
閱讀 1235·2021-09-08 10:41
閱讀 2919·2021-09-01 10:42
閱讀 2595·2021-07-25 21:37
閱讀 1995·2019-08-30 15:56
閱讀 926·2019-08-30 15:55
閱讀 2759·2019-08-30 15:54