版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 陜西省安塞區(qū)高級(jí)中學(xué)2025-2026學(xué)年度第一學(xué)期期末高一地理考試(含答案)
- 2025-2026學(xué)年陜西省銅川二中九年級(jí)(上)期末數(shù)學(xué)試卷(含答案)
- 2026屆高三生物二輪復(fù)習(xí)課件:專題七 熱點(diǎn)聚焦 生態(tài)位
- 12月轉(zhuǎn)債策略展望:震蕩高低切或持續(xù)建議穩(wěn)健配置
- 飛機(jī)附件培訓(xùn)
- 2026臺(tái)州市水利水電勘測(cè)設(shè)計(jì)院有限公司招聘筆試備考試題及答案解析
- 2026年西北民族大學(xué)舞蹈學(xué)院專任教師招聘考試備考試題及答案解析
- 2026時(shí)代北汽(北京)新能源科技有限公司 (正式工)招聘?jìng)淇伎荚囋囶}及答案解析
- 2026廣東廣州市天河區(qū)培藝學(xué)校招聘初中英語(yǔ)老師1人備考考試題庫(kù)及答案解析
- 2026年度煙臺(tái)招遠(yuǎn)市事業(yè)單位公開招聘工作人員(47人)備考考試試題及答案解析
- 大數(shù)據(jù)驅(qū)動(dòng)下的塵肺病發(fā)病趨勢(shì)預(yù)測(cè)模型
- 炎德英才大聯(lián)考雅禮中學(xué)2026屆高三月考試卷英語(yǔ)(五)(含答案)
- 【道 法】期末綜合復(fù)習(xí) 課件-2025-2026學(xué)年統(tǒng)編版道德與法治七年級(jí)上冊(cè)
- 2025-2026學(xué)年仁愛科普版七年級(jí)英語(yǔ)上冊(cè)(全冊(cè))知識(shí)點(diǎn)梳理歸納
- TNAHIEM 156-2025 口內(nèi)數(shù)字印模設(shè)備消毒滅菌管理規(guī)范
- 頂棚保溫施工組織方案
- ISO13485:2016醫(yī)療器械質(zhì)量管理手冊(cè)+全套程序文件+表單全套
- 學(xué)校6S管理培訓(xùn)
- DB15-T 4031-2025 建設(shè)項(xiàng)目水資源論證表編制導(dǎo)則
- 2025-2030國(guó)學(xué)啟蒙教育傳統(tǒng)文化復(fù)興與商業(yè)模式探索報(bào)告
- 2025年事業(yè)單位考試(醫(yī)療衛(wèi)生類E類)職業(yè)能力傾向測(cè)驗(yàn)試卷及答案指導(dǎo)
評(píng)論
0/150
提交評(píng)論