91. 如果一個類中有一個方法是抽象方法,而這個類沒有定義成抽象類困肩,會報錯嗎划纽?
答:會,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"
92. 如果一個類是抽象類,而類中的方法都是非抽象的方法锌畸,會報錯嗎?
答:不會報錯,如果一個類是抽象類比默,其中可以沒有抽象方法幻捏,但是一個類中有個方法是抽象方法,那么這個類一定是一個抽象類
廣告
去逛逛
93 PHP有哪些設(shè)計模式命咐?
單例模式
$_instance必須聲明為靜態(tài)的私有變量
構(gòu)造函數(shù)和析構(gòu)函數(shù)必須聲明為私有,防止外部程序new 類從而失去單例模式的意義
getInstance()方法必須設(shè)置為公有的,必須調(diào)用此方法 以返回實例的一個引用
::操作符只能訪問靜態(tài)變量和靜態(tài)函數(shù)
new對象都會消耗內(nèi)存
使用場景:最常用的地方是數(shù)據(jù)庫連接篡九。
使用單例模式生成一個對象后, 該對象可以被其它眾多對象所使用醋奠。
私有的__clone()方法防止克隆對象
單例模式榛臼,使某個類的對象僅允許創(chuàng)建一個。構(gòu)造函數(shù)private修飾钝域,
申明一個static getInstance方法讽坏,在該方法里創(chuàng)建該對象的實例锭魔。如果該實例已經(jīng)存在例证,則不創(chuàng)建。比如只需要創(chuàng)建一個數(shù)據(jù)庫連接迷捧。
工廠模式
工廠模式织咧,工廠方法或者類生成對象,而不是在代碼中直接new漠秋。
使用工廠模式笙蒙,可以避免當(dāng)改變某個類的名字或者方法之后,在調(diào)用這個類的所有的代碼中都修改它的名字或者參數(shù)
注冊模式
注冊模式庆锦,解決全局共享和交換對象捅位。已經(jīng)創(chuàng)建好的對象,掛在到某個全局可以使用的數(shù)組上搂抒,在需要使用的時候艇搀,直接從該數(shù)組上獲取即可。將對象注冊到全局的樹上求晶。任何地方直接去訪問焰雕。
適配器模式
將各種截然不同的函數(shù)接口封裝成統(tǒng)一的API。
PHP中的數(shù)據(jù)庫操作有MySQL,MySQLi,PDO三種芳杏,可以用適配器模式統(tǒng)一成一致矩屁,使不同的數(shù)據(jù)庫操作,統(tǒng)一成一樣的API爵赵。類似的場景還有cache適配器吝秕,可以將memcache,redis,file,apc等不同的緩存函數(shù),統(tǒng)一成一致空幻。
首先定義一個接口(有幾個方法郭膛,以及相應(yīng)的參數(shù))。然后氛悬,有幾種不同的情況则剃,就寫幾個類實現(xiàn)該接口耘柱。將完成相似功能的函數(shù),統(tǒng)一成一致的方法棍现。
策略模式
策略模式调煎,將一組特定的行為和算法封裝成類,以適應(yīng)某些特定的上下文環(huán)境己肮。
eg:假如有一個電商網(wǎng)站系統(tǒng)士袄,針對男性女性用戶要各自跳轉(zhuǎn)到不同的商品類目,并且所有的廣告位展示不同的廣告谎僻。在傳統(tǒng)的代碼中娄柳,都是在系統(tǒng)中加入各種if else的判斷,硬編碼的方式艘绍。如果有一天增加了一種用戶赤拒,就需要改寫代碼。使用策略模式诱鞠,如果新增加一種用戶類型挎挖,只需要增加一種策略就可以。其他所有的地方只需要使用不同的策略就可以航夺。
首先聲明策略的接口文件蕉朵,約定了策略的包含的行為。然后阳掐,定義各個具體的策略實現(xiàn)類始衅。
觀察者模式
1:觀察者模式(Observer),當(dāng)一個對象狀態(tài)發(fā)生變化時缭保,依賴它的對象全部會收到通知汛闸,并自動更新。
2:場景:一個事件發(fā)生后涮俄,要執(zhí)行一連串更新操作蛉拙。傳統(tǒng)的編程方式,就是在事件的代碼之后直接加入處理的邏輯彻亲。當(dāng)更新的邏輯增多之后孕锄,代碼會變得難以維護。這種方式是耦合的苞尝,侵入式的畸肆,增加新的邏輯需要修改事件的主體代碼。
3:觀察者模式實現(xiàn)了低耦合宙址,非侵入式的通知與更新機制轴脐。
定義一個事件觸發(fā)抽象類。
原型模式
原型模式(對象克隆以避免創(chuàng)建對象時的消耗)
1:與工廠模式類似,都是用來創(chuàng)建對象大咱。
2:與工廠模式的實現(xiàn)不同恬涧,原型模式是先創(chuàng)建好一個原型對象,然后通過clone原型對象來創(chuàng)建新的對象碴巾。這樣就免去了類創(chuàng)建時重復(fù)的初始化操作溯捆。
3:原型模式適用于大對象的創(chuàng)建,創(chuàng)建一個大對象需要很大的開銷厦瓢,如果每次new就會消耗很大提揍,原型模式僅需要內(nèi)存拷貝即可。
裝飾器模式
1:裝飾器模式煮仇,可以動態(tài)的添加修改類的功能
2:一個類提供了一項功能劳跃,如果要在修改并添加額外的功能,傳統(tǒng)的編程模式浙垫,需要寫一個子類繼承它刨仑,并重寫實現(xiàn)類的方法
3:使用裝飾器模式,僅需要在運行時添加一個裝飾器對象即可實現(xiàn)绞呈,可以實現(xiàn)最大額靈活性贸人。
94. final 關(guān)鍵字的應(yīng)用應(yīng)注意的問題间景?
使用final關(guān)鍵字定義的類佃声,禁止繼承。
使用final關(guān)鍵字定義的方法倘要,禁止重寫圾亏。
95. 如果一個類既要繼承一個父類,又要實現(xiàn)多個接口封拧,該如何寫志鹃?
書寫格式例如: class MaleHuman extends Human implements Animal,Life { ... }
96. 什么是單點入口呢?
? ? ? ? 所謂單點入口就是整個應(yīng)用程序只有一個入口泽西,所有的實現(xiàn)都通過這個入口來轉(zhuǎn)發(fā)曹铃,
? ? ? ? 比如說在上面我們就使用index.php作為程序的單點入口,當(dāng)然這個是可以由你自己任意控制的捧杉。
單點入口有幾大好處:
? ? 第一陕见、一些系統(tǒng)全局處理的變量,類味抖,方法都可以在這里進行處理评甜。比如說你要對數(shù)據(jù)進行初步的過濾,你要模擬session處理仔涩,你要定義一些全局變量忍坷,甚至你要注冊一些對象或者變量到注冊器里面
? ? 第二、程序的架構(gòu)更加清晰明了。
97. PHP提供了2套正則表達式函數(shù)庫,分別是哪兩套佩研?
(1) PCRE? Perl兼容正則表達式? ? ? ? preg_? 為前綴
(2) POSIX? 便攜式的操作系統(tǒng)接口? ? ? ereg_? 為前綴
98. 正則表達式的組成柑肴?
? ? 由原子(普通字符,如英文字符)旬薯、
? ? 元字符(有特殊功用的字符)
? ? 模式修正字符
? ? 一個正則表達式中嘉抒,至少包含一個原子
99. 不常用魔術(shù)方法的觸發(fā)時機?
__isset()? __unset()的觸發(fā)時機
__sleep()袍暴、 __wakeup()? 在對對象進行串行化的時候調(diào)用
如果序列化對象的時候些侍,不寫__sleep()方法,則所有的成員屬性都會被序列化政模,而定義了__sleep()方法岗宣,則只序列化指定數(shù)組中的變量。
因此淋样,如果有非常大的對象而并不需要完全儲存下來時此函數(shù)也很有用耗式。
使用 __sleep 的目的是關(guān)閉對象可能具有的任何數(shù)據(jù)庫連接,提交等待中的數(shù)據(jù)或進行類似的清除任務(wù)趁猴。此外刊咳,如果有非常大的對象而并不需要完全儲存下來時此函數(shù)也很有用。
使用 __wakeup 的目的是重建在序列化中可能丟失的任何數(shù)據(jù)庫連接以及處理其它重新初始化的任務(wù)儡司。
100. OOP的三大特性是什么娱挨?
1. 封裝性:
? ? 也稱為信息隱藏,就是將一個類的使用和實現(xiàn)分開捕犬,只保留部分接口和方法與外部聯(lián)系跷坝,或者說只公開了一些供開發(fā)人員使用的方法。
? ? 于是開發(fā)人員只需要關(guān)注這個類如何使用碉碉,而不用去關(guān)心其具體的實現(xiàn)過程柴钻,這樣就能實現(xiàn)MVC分工合作,也能有效避免程序間相互依賴垢粮,
? ? ? 實現(xiàn)代碼模塊間松藕合贴届。
2. 繼承性:
? ? 就是子類自動繼承其父級類中的屬性和方法,并可以可以添加新的屬性和方法或者對部分屬性和方法進行重寫蜡吧。繼承增加了代碼的可重用性毫蚓。
? ? php只支持單繼承,也就是說一個子類只能有一個父類斩跌。
3. 多態(tài)性:
? ? 子類繼承了來自父級類中的屬性和方法绍些,并對其中部分方法進行重寫。
? ? 于是多個子類中雖然都具有同一個方法耀鸦,但是這些子類實例化的對象調(diào)用這些相同的方法后卻可以獲得完全不同的結(jié)果柬批,這種技術(shù)就是多態(tài)性啸澡。
? ? 多態(tài)性增強了軟件的靈活性。