某知名共享單車公司PHP工程師面試筆試真題6_第1頁(yè)
某知名共享單車公司PHP工程師面試筆試真題6_第2頁(yè)
某知名共享單車公司PHP工程師面試筆試真題6_第3頁(yè)
某知名共享單車公司PHP工程師面試筆試真題6_第4頁(yè)
某知名共享單車公司PHP工程師面試筆試真題6_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

某知名共享單車公司PHP工程師面試筆試真題6

一、選擇題

1.實(shí)驗(yàn)高中的小明暗戀女神同學(xué)已經(jīng)三年了,高考結(jié)束后,小明決定向女神

同學(xué)表白。這天,小明來(lái)到女神樓下等待女神的出現(xiàn),時(shí)間一分一秒地流逝,

兩個(gè)多小時(shí)過(guò)去了,女神還沒(méi)有出現(xiàn),小明看了下表,時(shí)針和分

針的位置正好跟開始等的時(shí)候互換,請(qǐng)問(wèn)小明一共等了女神_____分鐘。

A.165

B.150

C.172

D.166

正確答案:D

[解析]根套題目中的描述,可以畫一個(gè)表示時(shí)針與分針的圖例,如下期所示。

假設(shè)小明開始等待女神的那一時(shí)刻時(shí)針與分針的夾角為?;《?,那么,等

到時(shí)針與分針正好互換位置時(shí),時(shí)針走過(guò)了0弧度,而由于分針轉(zhuǎn)動(dòng)一圈表示

的時(shí)間為一個(gè)小時(shí),鐘表一圈是一個(gè)圓,表示的弧度值為2兀,分針因?yàn)橐D(zhuǎn)若

干圈才能到達(dá)時(shí)針的位置,記分鐘所轉(zhuǎn)圈數(shù)為n,此時(shí)分針轉(zhuǎn)過(guò)的角度則為2五

n-?;《取?/p>

題目強(qiáng)調(diào),“時(shí)間一分一秒地流逝,兩個(gè)多小時(shí)過(guò)去了,女神還沒(méi)有出

現(xiàn)”,通過(guò)這條信息可知,分針轉(zhuǎn)了2?3圈,接近3圈,此時(shí)可知,n值取

3,所以,時(shí)針轉(zhuǎn)過(guò)的角度值為0,分針轉(zhuǎn)過(guò)的角度值為2兀*3-。=6兀-。。

對(duì)于時(shí)針而言,2n代表一圈,即12個(gè)小時(shí),那么弧度。表示的時(shí)間值為

12*8/2B小時(shí),對(duì)于分針而言,2Ji代表一圈,即60分鐘,那么6冗一。表示的

是60*(6五-。)/2兀分鐘。由于時(shí)鐘走過(guò)的時(shí)間值與分鐘走過(guò)的時(shí)間值所代表的

時(shí)間量是一個(gè)量,故而二者是相等的,由此可以構(gòu)建如下等式關(guān)系:

(120/2JI)*60=60*(6JI-8)/2JI

求解上述等式可知,0=6n/13,即小明等待的時(shí)間反映在鐘表上為6n

/13弧度值,所以,小明一共等了12*(6兀/13)/2冗小時(shí),即36/13小時(shí),合

166分鐘。

所以,本題的答案為D。

2.全等運(yùn)算符===如何比較兩個(gè)值?

A.把它們轉(zhuǎn)換成相同的數(shù)據(jù)類型再比較轉(zhuǎn)換后的值

B.只在兩者的數(shù)據(jù)類型和值都相同時(shí)才返回true

C.如果兩個(gè)值是字符串,則進(jìn)行詞匯比較

D.基于strcmp函數(shù)進(jìn)行比較

正確答案:B

[解析]全1運(yùn)算符主要比較兩者數(shù)據(jù)類型和值是否相等,都相等時(shí)才會(huì)返回

true。

本題中,對(duì)于選項(xiàng)A,全等運(yùn)算符是先比較它們的值是否相等,如果不相

等,那么返回false;如果相等,那么比較數(shù)據(jù)類型是否相等。并不是先轉(zhuǎn)換相

同的數(shù)據(jù)類型,再進(jìn)行值的比較。選項(xiàng)A錯(cuò)誤。

對(duì)丁選項(xiàng)B,全等運(yùn)算符是比較兩者的數(shù)據(jù)類型和值是否都相等,如果數(shù)

據(jù)類型和值都相等,那么返回true。選項(xiàng)B正確。

對(duì)于選項(xiàng)C,如果比較的兩個(gè)值都是字符串,那么會(huì)對(duì)每個(gè)字符進(jìn)行比

較,而不是進(jìn)行詞匯比較。選項(xiàng)C錯(cuò)誤。

對(duì)于選項(xiàng)D,strcmp只能用來(lái)比較兩個(gè)字符串的值是否相等,而全等比較

還能比較兩個(gè)數(shù)據(jù)的類型是否相等,顯然它們的功能是不同的,因此全等也不

是基于strcmp實(shí)現(xiàn)的。選項(xiàng)D錯(cuò)誤。

所以,本題的答案為B。

3.可以用來(lái)表現(xiàn)以下條件判斷最合適的語(yǔ)法結(jié)構(gòu)是

if($a==,a,){

somefunctionO;

}elseif($a==,b,){

anotherfunction();

}elseif($a==,c){

dosomething();

}else{

donothingO;

A.沒(méi)有default的switch語(yǔ)句

B.一個(gè)遞歸函數(shù)

C.while語(yǔ)句

D.有default的switch語(yǔ)句

正確答案:D

[解析]對(duì)于if...elseif...else結(jié)構(gòu)的分支結(jié)構(gòu)程序可以使用switch語(yǔ)句進(jìn)

行優(yōu)化,從而可以避免冗長(zhǎng)的代碼塊。本題中,else相當(dāng)于switch里面的

default部分,即條件沒(méi)有符合的都可以執(zhí)行到default里面的語(yǔ)句。選項(xiàng)A錯(cuò)

誤,選項(xiàng)D正確。

邏輯判斷語(yǔ)句是不可能被改成循環(huán)語(yǔ)句或遞歸函數(shù)完成對(duì)應(yīng)功能的,選項(xiàng)

B選項(xiàng)C錯(cuò)誤。

所以,本題的答案為D。

4.假設(shè)$a=5,有$1)=($@—),貝ij$b是

A.4

B.5

C.6

D.O

正確答案:B

[解析]$4($5-)相當(dāng)丁$4$曠-,$〃一會(huì)先把$&的值賦值給$b再減1,得到

$b=5o

所以,本題的答案為B。

5.考慮如下數(shù)組,能從數(shù)組$multi_array中找出值cat的方法是

$mu11i_array=array("red","green”,

42二〉〃blue",

yellow=>array(apple,9=>pear,banana,

orange=>array(dog,cat,iguana))

);

A.$multi_arrayyellow']['apple*][0]

B.$multi_arrayblue'][0]['orange'][1]

C.$multi_array[3][3][2]

D.array]yellow']['orange,]['cat']

E.$multi_arrayyellow']['orange,][1]

正確答橐:E

[解析]$multi_array數(shù)組是一個(gè)多維數(shù)組,值cat在orange數(shù)組中,鍵名

1,orange又在yellow,數(shù)組中,所以獲得cat值的方法應(yīng)該為

$multi_array[*yellow,]orange,][1]。選項(xiàng)E正確。

所以,本題的答案為E。

6.下面關(guān)于PHP抽象類的描述中,錯(cuò)誤的是

A.PHP中抽象類使用abstract關(guān)鍵字定義

B.沒(méi)有方法體的方法叫抽象方法,包含抽象方法的類必須是抽象類

C.抽象類中必須有抽象方法,否則不叫抽象類

D.抽象類不能實(shí)例化,也就是不可以new成對(duì)象

正確答案:c

[解析]抽象類可以是個(gè)空類,也就是不一定需要有抽象方法。但抽象方法只能

存在抽象類中。選項(xiàng)C錯(cuò)誤。

所以,本題的答案為C。

10.___處理HTTP文件上傳時(shí),PHP把文件存儲(chǔ)在$FILES中。在PHP腳本的執(zhí)行

周期中,這些文件將被放在本地的臨時(shí)文件夾里,而在腳本結(jié)束后,文件將被

自動(dòng)刪除。在處理HTTP文件上傳時(shí),確保當(dāng)前操作的文件是正確的方法有

_____(雙選)

A.操作前,將文件名與瀏覽器報(bào)告的文件名對(duì)比

B.操作前,用fileexists函數(shù)確保文件存在

C.用isuploadedfile0函數(shù)確認(rèn)文件的確是通過(guò)HTTP方式傳輸過(guò)來(lái)的

D.用moveuploadfile。將文件移動(dòng)到安全位置

E.只信任PHP存儲(chǔ)臨時(shí)文件目錄下的文件

正確答案:CD

[解析]在上傳前,一定要用is_uploaded_file()函數(shù)確保文件名正確傳輸,并

把本地臨時(shí)文件通過(guò)move_upload_fiie()函數(shù)在上傳文件前檢查文件,再移動(dòng)

文件到安全位置進(jìn)行長(zhǎng)期保存,防止文件丟失。而在操作前不需要特意地對(duì)文

件名進(jìn)行對(duì)比和使用。file_exists()函數(shù)判斷文件是否存在。其次,文件的上

傳,PHP并不是只信任臨時(shí)文件目錄下的文件。選項(xiàng)C選項(xiàng)D正確。

所以,本題的答案為CD。

11.如果用+操作符把一個(gè)字符串和一個(gè)整型數(shù)字相加,那么結(jié)果是

A.解釋器輸出一個(gè)類型錯(cuò)誤

B.字符串將被轉(zhuǎn)換成數(shù)字,再與整型數(shù)字相加

C.字符串將被丟棄,只保留整型數(shù)字

D.字符串和整型數(shù)字將連接成一個(gè)新字符串

E.整型數(shù)字將被丟棄,而保留字符串

正確答案:B

[解析]字符串將被轉(zhuǎn)換成數(shù)字(如果無(wú)法發(fā)生轉(zhuǎn)換,那么就是0),然后與整型

數(shù)字相加。

所以,本題的答案為B。

12.下列函數(shù)不是被用于處理數(shù)組的是_____

A.inarray()

B.array_slice()

C.list()

D.intval()

正確答案:D

[解析]本題中,in_array()函數(shù)可以判斷值是否在數(shù)組中,array_slice()函

數(shù)可以在數(shù)組中根據(jù)條件取出一段值,list。函數(shù)可以一次操作所有的變量,

無(wú)論是單個(gè)變量還是數(shù)組都可以。而intval()函數(shù)是獲取數(shù)據(jù)的整數(shù)值,不能

用于對(duì)象中。選項(xiàng)D正確。

所以,本題的答案為D。

13.以下關(guān)于PHP文件處理的說(shuō)法中,正確的是

A.file_get_contcnts()函數(shù)能用來(lái)抓取網(wǎng)頁(yè)數(shù)據(jù),但是沒(méi)辦法設(shè)置超時(shí)時(shí)間

B.fileO函藪既能讀取文本文件也能讀取二進(jìn)制文件,但是讀取二進(jìn)制文件有

可能出現(xiàn)安全問(wèn)題

C.如果表單中沒(méi)有選擇上傳的文件,則PHP變量的值將為NULL

D.fsockopen()和fputs()結(jié)合起來(lái)可以發(fā)送郵件,也可以用來(lái)抓取網(wǎng)頁(yè)內(nèi)容、

下載ftp文件等

正確答案:C

[解析]對(duì)于選項(xiàng)A,可以通過(guò)context參數(shù)設(shè)置超時(shí)時(shí)間。選項(xiàng)A錯(cuò)誤。

對(duì)于選項(xiàng)B,file。函數(shù)可以安全用于讀取二進(jìn)制文件。選項(xiàng)B錯(cuò)誤。

對(duì)于選項(xiàng)C,表單中沒(méi)有文件上傳時(shí),PHP的$_FILES變量值為NULL。選

項(xiàng)C正確。

對(duì)于選項(xiàng)D,fputs()用于寫入字符串到文件中時(shí),只能用于上傳不能用于

下載ftp文件。選項(xiàng)D錯(cuò)誤。

所以,本題的答案為C。

14.下列PHP配置項(xiàng)中,和安全最不相關(guān)的是

A.openbasedir

B.register_globals

C.disablefunctions

D.file_uploads

正確答案:D

[解析]對(duì)于選項(xiàng)A,open_basedir可將用戶訪問(wèn)文件的活動(dòng)范圍限制在指定的

區(qū)域,通常是其家目錄的路徑,也可用符號(hào)來(lái)代表當(dāng)前目錄。注意,用

open_basedir指定的限制實(shí)際上是前綴,而不是目錄名。舉例來(lái)說(shuō),若

uopen_basedir=/dir/user,那么目錄“/dir/user"和“/dir/userl”都是

可以訪問(wèn)的。所以如果要將訪問(wèn)限制在僅為指定的目錄,那么要用斜線結(jié)束路

徑名。例如,設(shè)置成"openbasedir=/dir/user/"o

對(duì)于選項(xiàng)B,registejglobals的意思就是注冊(cè)為全局變量,所以當(dāng)它的

值被設(shè)為on的時(shí)候,傳遞過(guò)來(lái)的值會(huì)被直接注冊(cè)為全局變量來(lái)使用。當(dāng)被設(shè)為

off的時(shí)候,要到特定的數(shù)組里去獲得它。但需要注意的是:

1)從PHP4.2.0版開始,配置文件中register_globals的默認(rèn)值從on改

為off,雖然可以設(shè)置它為。n,但是當(dāng)無(wú)法控制服獎(jiǎng)器的時(shí)候,代碼的兼容性

就成為一個(gè)大問(wèn)題,所以,最好從現(xiàn)在就開始使用。ff的風(fēng)格來(lái)編程。

2)當(dāng)register_globals打開以后,各種變量都會(huì)被注入代碼中,例如,

來(lái)自HTML表單的請(qǐng)求變量。再加上PHP在使用變量之前是無(wú)須進(jìn)行初始化的,

這就使得更容易寫出不安全的代碼。當(dāng)打開時(shí),人們使用變量時(shí)確實(shí)不知道變

量是哪里來(lái)的。但是register_globals的關(guān)閉改變了這種代碼內(nèi)部變量和客戶

端發(fā)送的變量混雜在一起的糟糕情況。

對(duì)于選項(xiàng)C,disable_functions限制程序使用一些可以直接執(zhí)行系統(tǒng)命

令的函數(shù),如system、exec、passthru、shellexec>procopen等。所以如

果想保證服務(wù)器的安全,那么要將這個(gè)函數(shù)加到disable_functions里或者將

安全模式打開。

對(duì)于選項(xiàng)D,file_uploads是決定PHP文件上傳時(shí)記錄file_uploads指

令是否啟用的函數(shù),默認(rèn)值為。n。該函數(shù)和安全最不相關(guān),選項(xiàng)D正確。

所以,本題的答案為D。

15.在PHP中,使用sendmail程序從Windows或Novell系統(tǒng)中發(fā)送郵件的

方式,與從類UNIX系統(tǒng)中發(fā)送的方式不同。以下哪些選項(xiàng)說(shuō)明了這個(gè)不

同?(雙選)

AJVindows/Novell不需要第三方軟件的支持就能實(shí)現(xiàn)該功能

B.UNIX中,sendmail_from的配置決定了郵件頭中的From信息

C.在Windows/Novell中,無(wú)法發(fā)送有多個(gè)收件人的電子郵件,每個(gè)收件人都必

須單獨(dú)發(fā)送

D.有可能完全相同,這取決于sendmailpath的配置

E.不同于Windows/Novell,在UNIX中,必須用SMTP和smtpport配置好MTA

主機(jī)和端口

正確答案:AD

[解析]對(duì)于選項(xiàng)A,Windows/Novell版本通過(guò)SMTP可以直接用MTA發(fā)送郵

件,而UNIX的PHP需要用sendmail程序通過(guò)MTA發(fā)送郵件。選項(xiàng)A正確,選

項(xiàng)E錯(cuò)誤。

對(duì)于選項(xiàng)B,在Windows/Novell上使用mail。時(shí),需要配置

sendmailfrom才能使用,并不是通過(guò)sendmailfrom配置決定郵件中的From

信息。而UNIX發(fā)郵件是交給sendmail程序來(lái)處理的。選項(xiàng)D正確,選項(xiàng)B錯(cuò)

誤。

對(duì)于選項(xiàng)3條件允許的情況卜,Windows/Novell上的PHP可以進(jìn)行配

置,通過(guò)“sendmail”封裝器模擬sendmail發(fā)信,可以發(fā)送多個(gè)收件人的電子

郵件。選項(xiàng)C錯(cuò)誤。

所以,本題的答案為AD。

二、填空題

1.假設(shè)機(jī)器上沒(méi)有安裝sendmail,要想mail函數(shù)能在Windows下使用,需

要o

正確答案:

改變php.ini的設(shè)置。

[解析]在UNIX、Linux系統(tǒng)中,PHP主要使用sendmail程序來(lái)處理郵件。而在

Windows中除非已經(jīng)有sendmail包裝器,否則只能使用服務(wù)器的SMTP配置進(jìn)

行,而SMTP是可以在php.ini文件中進(jìn)行配置開啟的。

2.PHP支持的流傳輸方式的是和o

正確答案:

STDIO>stream。

[解析]PHP只支持兩種流傳輸,分別為本地操作的STDIO和遠(yuǎn)程操作的

stream,并且可以根據(jù)創(chuàng)建的流的類型來(lái)自動(dòng)選擇合適的傳輸方式。

3.能讓類在整個(gè)腳本里只實(shí)例化一次的設(shè)計(jì)模式是o

正確答案:

單例模式。

[解析]單例模式是一種用于確保程序中只有一個(gè)類實(shí)例化的程序。

4.使用final關(guān)鍵字時(shí),應(yīng)注意的問(wèn)題有、、3

正確答案:

定義的類禁止繼承;定義的成員禁止繼承;定義的方法禁止重寫。

5.即時(shí)加載一個(gè)類的方法是o

正確答案:

splautoloadregister()函數(shù)。

[解析]spl_autoload_registerl()提供了一種更加靈活的方式來(lái)實(shí)現(xiàn)類的自動(dòng)

加載(同一個(gè)應(yīng)用文件可支持任意數(shù)量的加載器,比如第三方庫(kù)中的類文

件)o而—autoload。函數(shù)在PHP7.2版本中已經(jīng)被廢除。

三、簡(jiǎn)答題

1.5名海盜搶得了窖藏的100枚金幣,并打算瓜分這些戰(zhàn)利品。這是一些講

民主的海盜(當(dāng)然是他們自己特有的民主),他們的習(xí)慣是按卜面的方式進(jìn)行分

配:最厲害的一名海盜提出分配方案,然后所有的海盜(包括提出方案者本人)

就此方案進(jìn)行表決。如果50%或更多的海盜贊同此方案,此方案就獲得通過(guò)并據(jù)

此分配戰(zhàn)利品。否則提出方案的海盜將被扔到海里,然后下一名最厲害的海盜

又重復(fù)上述過(guò)程。

所有的海盜都樂(lè)于看到他們的一位同伙被扔進(jìn)海里,不過(guò),如果讓他們

選擇的話,他們還是寧可得一筆現(xiàn)金。他們當(dāng)然也不愿意自己被扔到海里。所

有的海盜都是有理性的,而且知道其他的海盜也是有理性的。此外,沒(méi)有兩名

海盜是同等厲害的一一這些海盜按照完全由上到下的等級(jí)排好了座次,并且每

個(gè)人都清楚自己和其他所有人的等級(jí)。這些金塊不能再分,也不允許幾名海盜

共有金塊,因?yàn)槿魏魏1I都不相信他的同伙會(huì)遵守關(guān)于共享金塊的安排。這是

一伙每人都只為自己打算的海盜。

最兇的一名海盜應(yīng)當(dāng)提出什么樣的分配方案才能使他獲得最多的金子呢?

正確答案:

如果輪到第四個(gè)海盜分配:100,0;

輪到第三個(gè):99,0,1;

輪到第二個(gè):99,0,1,0;

輪到第一個(gè):98,0,1,0,1,這就是第一個(gè)海盜的最佳方案。

可以從后往前推測(cè)每次最優(yōu)的方案,從而確定第一種方案就是最好的。

1)當(dāng)只剩兩個(gè)海盜分金時(shí),因?yàn)橹灰?0布或以上的支持率則方案通過(guò),

所以第四個(gè)海盜和第五個(gè)海盜分金時(shí),無(wú)論第五個(gè)海盜是否支持自己,第四個(gè)

海盜都可以給自己分配100枚金幣。

2)當(dāng)只剩三個(gè)海盜分金時(shí),第三個(gè)海盜分金的方案,除了自己的支持外,

還需要一個(gè)海盜的支持,否則方案不通過(guò)。所以,如果第三個(gè)海盜想要拿最多

金幣,最好的方案就是讓第五個(gè)海盜得到金幣來(lái)支持他,因?yàn)榈谒膫€(gè)海盜可以

通過(guò)否定第三個(gè)海盜的方案實(shí)現(xiàn)自己的利益最大化。所以,第三個(gè)海盜得99枚

金幣,而第五個(gè)海盜得1枚金幣的方案是最好的方案。

3)當(dāng)只剩下四個(gè)海盜分金時(shí),第二個(gè)海盜的方案,只需要一個(gè)海盜支持他

即可通過(guò)方案。由2)的分析知道,要第四個(gè)海盜支持自己是最有利的,所以可

以得到最好的方案是第二個(gè)海盜得99枚金幣,第四個(gè)海盜得1枚金幣的方案。

最初的情況,5個(gè)海盜分金,第一個(gè)海盜必須要其余2名海盜支持自己,

他才有可能得到最多的金幣。通過(guò)3)的分析知道,分配給第三個(gè)海盜和第五個(gè)

海盜1枚金幣,讓他們支持自己是最優(yōu)的方案。

2.如何定義一個(gè)函數(shù)?函數(shù)名區(qū)分大小寫嗎?

正確答案:

定義一個(gè)函數(shù)的步驟為以下幾點(diǎn),函數(shù)名的大小寫是不區(qū)分的。

1)通過(guò)function關(guān)鍵字聲明函數(shù),格式為function函數(shù)名(){}。

2)函數(shù)命名遵循變量命名的規(guī)則,以字母或卜劃線開頭,且不能以數(shù)字開

頭。

3)函數(shù)名不可以使用系統(tǒng)函數(shù)的名稱,且不能使用已經(jīng)聲明過(guò)的函數(shù)名。

PHP中函數(shù)名、方法名、類名不區(qū)分大小寫,但PHP的變量名是區(qū)分大小

寫的。

實(shí)現(xiàn)代碼為

<?php

functionabc(){

echo〃l〃;

)

ABC();

?>

程序運(yùn)行結(jié)果為1。

從上面運(yùn)行結(jié)果可以看出,函數(shù)名是abc小寫,但是可以通過(guò)ABC大寫去

調(diào)用該函數(shù)。

3.談?wù)勀銓?duì)MVC的認(rèn)識(shí),介紹幾種目前比較流行的MVC框架。

正確答案:

MVC是一種設(shè)計(jì)模式,由模型層、邏輯層和視圖層組成。用戶通過(guò)入口訪問(wèn)到控

制器,控制器從模型層獲取數(shù)據(jù)然后分配視圖,并加載數(shù)據(jù)到視圖層。用戶通

過(guò)視圖層操作向邏輯層反饋,邏輯層處理反饋,如果涉及數(shù)據(jù)庫(kù)操作,那么將

會(huì)在模型層中對(duì)數(shù)據(jù)庫(kù)增、冊(cè)h改、查。最后邏輯層將執(zhí)行結(jié)果返回到視圖

層。

目前比較流行的M行框架有Laravel、ThinkPHP、Yii>codelgniter>

CakePHP等。

4.請(qǐng)介紹說(shuō)明觀察者模式。

正確答案:

觀察者模式(也被稱為發(fā)布/訂閱模式)提供了避免組件之間緊密耦合的另一種方

法,它將觀察者和被觀察的對(duì)象分離開。在該模式中,一個(gè)對(duì)象通過(guò)添加一個(gè)

方法(該方法允許另一個(gè)對(duì)象,即觀察者注冊(cè)自己)使本身變得可觀察.當(dāng)可觀

察的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀察者。這些觀察者使用該信息

執(zhí)行的操作與可觀察的對(duì)象無(wú)關(guān),結(jié)果是對(duì)象可以相互對(duì)話,而不必了解原

因。

例如,用戶界面可以作為一個(gè)觀察者,業(yè)務(wù)數(shù)據(jù)是被觀察者,用戶界面觀

察業(yè)務(wù)數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向?qū)ο笤O(shè)計(jì)的一個(gè)

原則是,系統(tǒng)中的每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方面。一個(gè)對(duì)

象只做一件事情,并且將它做好。觀察者模式在模塊之間劃定了清晰的界限,

提高了應(yīng)用程序的可維護(hù)性和重用性。

實(shí)現(xiàn)的代碼如下:

<?php

〃觀察者接口

interfaceInterfaceobserver

{

functiononListen($sender,$args);

functiongetObserverName();

}

〃可被觀察者接口

interfaceInterfaceObservable

{

functionaddObserver($observer);

functionremoveObserver($observername);

)

〃觀察者抽象類

abstractclassObserverimplementsInterfaceobserver

(

protected$observername;

functiongetObserverName()

{

return$this->observername;

)

functiononListen($sender,$args)

()

}

〃可被觀察類

abstractclassObservableimplementsInterfaceObservable

{

protected$observers=array();

publicfunctionaddObserver($observer)

{

if($observerinstanceofInterfaceobserver)

{

$this->observers[]=$observer;

}

}

publicfunctionremoveObserver($observer_name)

{-

foreach($this->observersas$index=>$observer)

(

if($observer->getObserverName()===$observer_name)

(

arraysplice($this->observers,$index,1);

return;

}

}

)

}

〃模擬一個(gè)可以被觀察的類

classAextendsObservable

{

publicfunctionaddListener($listener)

{

foreach($this->observersas$observer)

(

$observer->onListen($this,$listener);

)

}

}

〃模擬一個(gè)觀察者類

classBextendsObserver

(

protected$observer_name=,B';

publicfunctiononListen($sender,$args)

(

varclump($sender);

echo〃Vbr>〃;

varclump($args);

echo〃Vbr>”;

)

}

〃模擬另外一個(gè)觀察者類

classCextendsObserver

{

protected$observer_name=,C,;

publicfunctiononListen(Ssender,$args)

(

vardump($sender);

echo"Vbr>〃;

var_dump($args);

echo"Vbr>〃;

$a=newA();

〃注入觀察者

$a->addObserver(newB());

$a->addObserver(newCO);

〃可以看到觀察到的信息

$a->addListenerCD');

〃移除觀察者

$ci->ie!!ioveObseivei-(?B,);

?>

5.Memcache的工作原理是什么?

正確答案:

Memcache的工作就是在專門的機(jī)器內(nèi)存里維護(hù)一張巨大的hash表,存儲(chǔ)經(jīng)常被

讀寫的一些文件與數(shù)據(jù),從而極大地提高網(wǎng)站的運(yùn)行效率。

Memcache的程序運(yùn)行在一個(gè)或多個(gè)服務(wù)器中,Memcache把全部的數(shù)據(jù)保

存在內(nèi)存中,通過(guò)hash表的方式,每條數(shù)據(jù)由key/value的形式構(gòu)成,隨時(shí)接

受客戶端的請(qǐng)求,然后返回結(jié)果。

客戶端與Memcache建立連接后,存儲(chǔ)對(duì)象主要是通過(guò)唯一的key存儲(chǔ)

value到內(nèi)存中,取數(shù)據(jù)時(shí)通過(guò)這個(gè)key從內(nèi)存中獲取對(duì)應(yīng)的value。因?yàn)?/p>

Memcache的數(shù)據(jù)是存儲(chǔ)在內(nèi)存中而不是保存在cache文件中,所以Memcache訪

問(wèn)比較快。但是因?yàn)檫@些數(shù)據(jù)不是永久化存儲(chǔ)?,所以不建議存儲(chǔ)重要數(shù)據(jù)在

Memcache中,因?yàn)橹貑⒎?wù)器后這些數(shù)據(jù)就會(huì)消失。

四、編程題

1.數(shù)字1-1000放在含有1001個(gè)元素的數(shù)組中,其中只有唯一的一個(gè)元素

值重復(fù),其他數(shù)字均只出現(xiàn)一次。設(shè)計(jì)一個(gè)算法,將重復(fù)元素找出來(lái),要求每

個(gè)數(shù)組元素只能訪問(wèn)一次。如果不使用輔助存儲(chǔ)空間,能否設(shè)計(jì)一個(gè)算法實(shí)現(xiàn)?

正確答案:

拿到題目,首先需要做的就是分析題目所要達(dá)到的目標(biāo)以及其中的限定條件。

從題目的描述中可以發(fā)現(xiàn),本題的目標(biāo)就是在一個(gè)有且僅有一個(gè)元素值重復(fù)的

數(shù)組中找出這個(gè)唯一的重復(fù)元素,而限定條件就是每個(gè)數(shù)組元素只能訪問(wèn)一

次,并且不許使用輔助存儲(chǔ)空間。

示例代碼如下:

<?php

/*

**函數(shù)功能:在數(shù)組中找唯一重復(fù)的元素

**輸入?yún)?shù):array數(shù)組首地址,len數(shù)組長(zhǎng)度

**返回值:重復(fù)元素的值,無(wú)重復(fù)元素則返回

*/

functionfindDup($array)

{

$len=count($array);

if(!$array|$len<l)

return-1;

$newArr=array();

for($1=0;$i<$1erj-1;$i++)

$newArr[$i]=0;

for($i=0;$i<$len;$i++)

{

if($newArr[$array[$i]-l]==0)

{

$newArr[$array;

}else

{

return$array[$i];

}

}

return-1;

}

$array=[l,3,4,2,5,3];

printf(,,%d,z,findDup($array));

?>

程序的運(yùn)行結(jié)果為

3

2.設(shè)計(jì)一個(gè)算法,判斷給定的一個(gè)數(shù)n是否是某個(gè)數(shù)的平方,不能使用開方

運(yùn)算。例如,16就滿足條件,因?yàn)樗?的平方;而15則不滿足條件,因?yàn)椴?/p>

存在一個(gè)數(shù)使得其平方值為15o

正確答案:

通過(guò)對(duì)平方數(shù)進(jìn)行分析發(fā)現(xiàn)有如下規(guī)律:

(n+l”2=if2+2n+l=(n-1)-2+(2*(n-1)+1)+2*n+l=…

=1+(2*1+1)+(2*2+1)+…+(2*n+l)。

通過(guò)上式可以發(fā)現(xiàn),這些項(xiàng)構(gòu)成了一個(gè)公差為2的等差數(shù)列的和,由此可

以得到如下的解決方法:對(duì).n依次減1,3,5,7,…,如果相減后的值大于

0,則繼續(xù)減下一項(xiàng);如果相減的后的值等于0,則說(shuō)明n是某個(gè)數(shù)的平方;如

果相減后的值小于0,則說(shuō)明n不是某個(gè)數(shù)的平方。根據(jù)這個(gè)思路,代碼實(shí)現(xiàn)如

下:

functionisPower($n)

{

if($n<=0)

(

printf(〃%d不是自然數(shù)\n〃,n);

returnfalse;

}

$minus=l;

while($n>0)

{

$n=$n-$minus;

//n是某個(gè)數(shù)的平方

if($n=0)

returntrue;

//n不是某個(gè)數(shù)的平方

elseif($n<0)

returnfalse;

〃每次減數(shù)都加2

else

$minus+=2;

)

returnfalse;

}

3.用類編程實(shí)現(xiàn):Stu類中有兩個(gè)私有屬性name和sex,有兩個(gè)公有方法,

setNameO和setSexO參數(shù)自定,方法可實(shí)現(xiàn)對(duì)兩個(gè)私有屬性進(jìn)行修改。在實(shí)例

化類的時(shí)候要求對(duì)私有屬性能初始化。

正確答案:

實(shí)現(xiàn)代碼如下:

<?php

ClassStu(

private$name;

private$sex;

publicfunctionsetName($name){

$this->name=$nair.e;

publicfunctionsetSex($sex){

$this->sex=$sex;

}

?>

4.把鏈表相鄰元素翻轉(zhuǎn),例如,給定鏈表為1->2->3->4->5->6->7,

則翻轉(zhuǎn)后的鏈表變?yōu)?->1->4->3->6->5->7O

正確答案:

主要思藤通過(guò)調(diào)整結(jié)點(diǎn)指針域的指向來(lái)直接調(diào)換相鄰的兩個(gè)結(jié)點(diǎn)。如果單

鏈表恰好有偶數(shù)個(gè)結(jié)點(diǎn),那么只需要將奇偶結(jié)點(diǎn)對(duì)調(diào),如果鏈表有奇數(shù)個(gè)結(jié)

點(diǎn),那么除最后一結(jié)點(diǎn)外的其他結(jié)點(diǎn)進(jìn)行奇偶對(duì)調(diào)。為了便于理解,下圖給出

了其中第一對(duì)結(jié)點(diǎn)對(duì)調(diào)的方法。

precur

⑤;⑥;

hcadT_THTn"H_d_H^TH'n_H^TH^TH"n~l

在上圖中,當(dāng)前遍歷到結(jié)點(diǎn)cur,通過(guò)①?⑥6個(gè)步驟用虛線的指針來(lái)代

替實(shí)線的指針實(shí)現(xiàn)相鄰結(jié)點(diǎn)的逆序。其中,①?④實(shí)現(xiàn)了前兩個(gè)結(jié)點(diǎn)的逆序操

作,⑤和⑥兩個(gè)步驟向后移動(dòng)指針,接著可以采用同樣的方式實(shí)現(xiàn)后面兩個(gè)相

鄰結(jié)點(diǎn)的逆序操作。

實(shí)現(xiàn)代碼如下:

<?php

header("content-type:text/html;charset=utf-8〃);

〃鏈表結(jié)點(diǎn)

classnode{

public$data;

〃存儲(chǔ)數(shù)據(jù)

public$next;

〃下一結(jié)點(diǎn)

publicfunction_construct($data){

$this->data=$data;

$this->next=NULL;

}

}

〃單鏈表

classlinkList(

private$header;

〃鏈表頭結(jié)點(diǎn)

〃構(gòu)造方法

publicfunction_construct($data=NULL){

$this->header=newnode($data);

)

〃添加結(jié)點(diǎn)數(shù)據(jù)

publicfunctionaddLink($node){

$current=$this->header;

while($current->next!=NULL){

$current=$

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論