某知名社交軟件公司PHP工程師面試筆試真題及答案_第1頁
某知名社交軟件公司PHP工程師面試筆試真題及答案_第2頁
某知名社交軟件公司PHP工程師面試筆試真題及答案_第3頁
某知名社交軟件公司PHP工程師面試筆試真題及答案_第4頁
某知名社交軟件公司PHP工程師面試筆試真題及答案_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

某知名社交軟件公司PHP工程師面試筆試真題及答案一、選擇題1、某城市發生了一起汽車撞人逃跑事件,該城市只有兩種顏色的車,其中,白色車占15%,黑色車占85%,事發時有一個人在現場看見似乎是一輛白色的車,但是根據專家在現場分析,在當時那種條件能看正確的可能性是80%。那么,肇事車是白車的概率是______

A.12%

B.29%

C.41%

D.80%

2、店主銷售電話卡,他以60元的價格銷售兩張,其中一張賺了20%,另一張虧了20%,那么他總共賺了______元。

A.-10

B.10

C.-5

D.0

3、有如下代碼:

<?php

$x="display";

${$x.'_result'}();

?>

以上代碼將會調用display_result()______

A.錯誤

B.正確

C.編譯錯誤

D.無答案

4、以下說法不正確的是______

A.PHP有4種標量類型:布爾型(boolean)、整型(integer)、浮點型(float)、字符串(string)

B.浮點型(float)與雙精度型(double)是同一種類型

C.復合類型包括數組(array)、對象(object)、資源(resource)

D.偽類型:混合型(mixed)、數字型(number)、回調(callback)

5、執行如下程序段:

<?php

echo24%(-5);

?>

程序的輸出結果是______

A.5

B.4

C.-4D.19

6、有如下代碼:

$String="Thisisatest,";

echoereg_replace("is","was",$string)."<br>";

echoereg_replace("()is","\\1was",$string)."<br>";

echoereg_replace("(()is)","\\2was",$string)."<br>";

程序的輸出結果為______

A.Thiswasatest.Thisisatest.Thiswasatest.

B.Thisisatest.Thisisatest.Thiswasatest.

C.Thisisatest.Thisisatest.Thisisatest.

D.Thiswasatest.Thisisatest.Thisisatest.

E.Thiswasatest.Thiswasatest.Thiswasatest.

7、設有一個數據庫mydb中有一個表tb1,表中有6個字段,主鍵為ID,有10條記錄,ID為0~9,以下代碼輸出結果是______

<?php

$link=mysq1_connect("localhost","mysq1_user","mysq1_password")

ordie("Couldnotconnect:".mysq1_error());

$result=mysq1_query("SELECTid,name,ageFROMmydb、tb1whereid<5");

ordie("Couldnotquery:.mysq1_error());

echomysq1_num_fields($result);

mysq1_close($link);

?>

A.6

B.5

C.4D.3

8、以下關于mysq1_pconnect的說法中,正確的是______

A.與數據庫進行多連接

B.與mysq1_connect功能相同

C.與@mysq1_connect功能相同

D.與數據庫建立持久連接

9、file()函數返回的數據類型是______

A.數組

B.字符串

C.整型

D.根據文件來定

10、index.php腳本通過post方法提交,獲取表單元素email的值的方法是______

A.$_GET['email']

B.$_POST['email']

C.$_SESSION['text']

D.$_REQUEST['email']

E.$_POST['text']

二、填空題11、運行時(run-time)包含一個PHP腳本使用______,而編譯時(compile-time)包含一個PHP腳本使用______。

12、函數______能讀取文本文件中的一行。讀取二進制文件或者其他文件時,應當使用______函數。

13、______函數能返回腳本里任意行中調用的函數的名稱。該函數同時還經常被用在調試中,用來判斷錯誤是如何發生的。

14、需要設置一個有效期為31天的Memcache值,請補充下面的代碼:

<?php

$memcache_obj=newMemcache();

$memcache_obj->connect('memcache_host,11211');

$memcache_obj->set('varKey','varValue',0,

);

?>

15、在PHP中,heredoc是一種特殊的字符串,它的結束標志必須______。

三、簡答題16、什么是內存管理?

17、抽象類至少有一個抽象方法嗎?

18、PHP如何判斷變量為空?

19、類與對象的區別是什么?

20、Memcache的最大優勢是什么?

四、編程題21、據說著名猶太歷史學家約瑟夫(Josephus)有過以下的故事:在羅馬人占領喬塔帕特后,39個猶太人與約瑟夫及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3個人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。

然而約瑟夫和他的朋友并不想遵從,約瑟夫要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。

約瑟夫問題可用代數分析來求解,假設現在您與m個朋友不幸參與了這個游戲,您要如何保護您與您的朋友?

22、一個數如果恰好等于它的因子之和,這個數就稱為“完數”。例如,6=1+2+3。編程找出1000以內的所有完數。

23、實現一個隊列的數據結構,使其具有入隊列、出隊列、查看隊列首尾元素、查看隊列大小等功能。

24、IP是否可以偽造?PHP中如何拿到真實IP?

答案:

一、選擇題

1、C[解析]

本題中,肇事車的情況一共存在著以下4種可能性:

1)如果肇事車是白色車,被正確識別的概率P1=15%*80%=12%。

2)如果肇事車是白色車,被看成是黑車的概率P2=15%*20%=3%。

3)如果肇事車是黑色車,被正確識別的概率P3=85%*80%=68%。

4)如果肇事車是黑色車,被看成是白車的概率P4=85%*20%=17%。

肇事車是白色車的概率P=P1/(P1+P4)=12%/(12%+17%)=41.3%,選項C正確。

所以,本題的答案為C。2、C[解析]

對于店主而言,假設賺了20%的那張電話卡的進價為x元,虧了20%的那張電話卡的進價為y元,根據題意,可得以下兩個等式:

得出x=50元,y=75元。

兩張電話卡的進價和為(50+75)元=125元,而售價和為(60+60)元=120元,因此,店主總共賺了(120-125)元=-5元,選項C正確。

所以,本題的答案為C。3、C[解析]

在PHP中,如果一個函數的名字不是確定的,那么可以把函數名存放到一個變量中,然后通過如下兩種方法調用:

1)直接通過“$變量名()”進行調用。

2)通過內置函數來進行調用,即

①mixedcall_user_func(callback$function[,mixed$parameter[,mixed$...]])

②mixedcall_user_func_array(callback$function,array$param_arr)

示例代碼如下:

<?php

functionhello($name)

{

echo"hello$name\n";

}

$f="hello";

$f("world");

//輸出helloworld

call_user_func('hello',"world");

//輸出helloworld

?>

對于本題而言,通過$x.'_result'拼接出的字符串為display_result,因此,${$x.'_result'}()也就等價于$display_result(),顯然變量名display_result是不存在的,因此編譯無法通過,一種可行寫法為$y=$x.'_result';$y();。

所以,本題的答案為C。4、C[解析]PHP主要有8種數據類型,根據類型還可以被劃分為3大類,標量類型中包含布爾型、整型和浮點型,復合類型包括數組和對象,特殊類型包括資源類型和空類型。除此之外,PHP還可以存在偽類型,主要是數據存在混合相關聯,所以存在偽類型。

所以,本題答案為C。5、B[解析]

在PHP中,取模運算符%的操作數在運算之前都會轉換成整數(除去小數部分)。其運算結果和被除數的符號(正負號)相同,即$a%$b的結果和$a的符號相同。本題中,24%(-5)的符號為正,結果為4。

所以,本題的答案為B。6、E[解析]ereg_replace()函數可以對符合正則條件的字符串進行替換,因為第一個是將is替換成was,所以,選項B選項C錯誤。第二句匹配的是“()is”規則,“()”表示的是匹配符合規則的字符串,而“\\1”表示的是和子匹配一樣的內容,那么會被替換成“Thiswasatest.”。第三個輸出中,“(()is)”匹配符合括號內規則的字符串,“\\2was”表示和第二個子匹配()is的內容一樣,會替換輸出為“Thiswasatest.”。選項E正確,選項A選項D錯誤。

所以,本題的答案為E。7、D[解析]mysql_num_fields()返回結果集中字段的數目,該語句主要查詢了id、name和age三個字段。選項D正確。

所以,本題的答案為D。8、D[解析]mysql_pconnect()函數打開一個到MySQL服務器的持久連接。

mysql_pconnect()和mysql_connect()非常相似,雖然只多了一個P,但它們有兩個主要區別:首先,當建立連接的時候,本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。其次,當腳本執行完畢后,到SQL服務器的連接不會被關閉,此連接將保持打開以備以后使用(mysql_close()不會關閉由mysql_pconnect()建立的連接)。選項D正確。

所以,本題的答案為D。9、A[解析]file()函數可以把整個文件讀入一個數組中,將文件作為一個數組返回,如果失敗,那么返回false。選項A正確。

所以,本題的答案為A。10、BD[解析]

通過post方法提交表單可以通過$_POST['email']獲取表單email的值,也可以通過$_REQUEST['email']方法獲取無論是post還是get傳過來對應的參數值。選項B選項D正確,選項A選項C選項E錯誤。

所以,本題的答案為BD。二、填空題

11、include,require。[解析]require(或requier_once())和include()(或include_once())都可以用來包含PHP文件,它們的唯一區別是,如果包含的文件不存在,那么require(或require_once())將產生一個致命錯誤,同時終止腳本的執行;而include(或include_once())只會產生一個警告,不終止后續腳本的執行。二者在運行和編譯引用文件時沒有區別。12、fgets(),fread()。[解析]fgets()函數主要用于讀取文本文件中的一行,而fread()函數主要用于讀取二進制文件。fseek()函數主要用于在打開的文件中定位,fputs()函數用于寫入文件。13、debug_backtrace。[解析]debug_backtrace()的作用是,返回在特定位置調用過的函數名組成的數組,經常被用于調試中。14、time()+31*24*3600或31*24*3600。[解析]

首先初始化Memcache對象,然后進行Memcache連接,最后用set方法設置過期時間。memcache::set語法為memcache::set("鍵","值","是否壓縮","設置過期時間,0為永久不過期"),其中時間值可以是一個時間戳,也可以是秒數。所以設置一個有效期為31天的Memcache值方法格式為memcache::set("key","value",0,time()+31*24*3600)。15、頂格寫,且以分號“;”結束。[解析]heredoc的語法是用“<<<”加上自己定義成對的標簽,在標簽范圍內的文字視為一個字串。結束表示符必須獨占一行,且必須頂格寫,最后以“;”分號結尾。示例代碼如下:

<?php

$str=<<<ED

hello

world.

ED;

echo$str;

?>

運行結果為

hello

world.三、簡答題16、內存管理主要指程序運行時對計算機內存資源的分配、使用和釋放等技術,內存管理的目標是高效、快速地分配內存,同時及時地釋放和回收內存資源。內存管理主要包括是否有足夠的內存供程序使用,從內存池中獲取可用內存,使用后及時銷毀并重新分配給其他程序使用。

在PHP開發過程中,如果遇到大數組等操作,那么可能會造成內存溢出等問題。一些常見的處理方法如下:

1)通過ini_set('memory_limit','64M')方法重置php可以使用的內存大小,一般在遠程主機上是不能修改php.ini文件的,只能通過程序設置。注:在safe_mode(安全模式)下,ini_set會失效。

2)對數組進行分批處理,及時銷毀無用的變量,盡量減少靜態變量的使用,在需要數據重用時,可以考慮使用引用(&)。同時對于數據庫、文件操作完要及時關閉,對象使用完,要及時調用析構函數等。

3)及時使用unset()函數釋放變量,使用時需要注意以下兩點:

①unset()函數只能在變量值占用內存空間超過256B時才會釋放內存空間。

②只有當指向該變量的所有變量都銷毀后,才能成功釋放內存。

17、如果一個類中有一個抽象方法,那么該類必須為抽象類,但抽象類中可以沒有抽象方法。

18、在PHP中,NULL與空是兩種不同的概念。isset()主要用來判斷變量是否被初始化過。empty()可以將值為“假”“空”“0”“NULL”“未初始化”的變量都判斷為true。is_null()僅把值為“NULL”的變量判斷為true。“var==null”把值為“假”“空”“0”“NULL”的變量都判斷為true。“var===null”僅把值為“NULL”的變量判斷為true。

19、(1)類與對象

對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。

類是具有相同屬性和服務的一組對象的集合。它為屬于該類的所有對象提供了統一的抽象描述,其內部包括屬性和服務兩個主要部分。在面向對象的編程語言中,類是一個獨立的程序單位,它應該有一個類名并包括屬性說明和服務說明兩個主要部分。在PHP中類定義的格式為

<?php

class類名{

//類體,包含類的屬性和操作屬性的方法

}

?>

類的方法和變量的權限修飾符有如下3種:public、protected和private。

偽變量$this可以在當一個方法在對象內部調用時使用。$this是一個到調用對象(該對象通常是方法所屬于的對象,但也可以是另一個對象,如果該方法是從第二個對象內調用的)的引用。

類與對象的關系就如模具和鑄件的關系,類的實例化結果就是對象,而這一類對象的抽象就是類。

(2)類的訪問符及“=>”的區別

在類中主要使用“::”和“_>”運算符訪問類中的屬性和方法,而它們和“=>”的區別如下:

1)“::”運算符是調用一個類中的靜態成員的方法,例如:

classtest{

protectedstatic$instance;

self::$instance="abc";

或者$this::$instance="def";

}

2)“_>”運算符是操作一個類中的成員變量的方法,可以是非static成員變量,例如:

classtest{

private$test;

$this_>test="abc";

}

3)“=>”運算符是數組的key和value映射時使用的運算符。

20、Memcache最大的優勢是具有很好的水平可擴展性,在一個巨大的系統中,客戶端做了一次存儲后,很容易增加大量的數據到Memcache的集群中,Memcache之間沒有互相通信,因此不會增加Memcache的負載,也不會網絡通信量爆炸。四、編程題21、實際上只要畫兩個圓圈就可以讓自己與朋友免于死亡游戲,這兩個圓圈中內圈是排列順序,而外圈是自殺順序,如下圖所示。

使用程序來求解時,只要將陣列當作環狀來處理,在陣列中由計數1開始,每三個數得到一個計數,直到計數到41為止;然后將陣列由索引1開始列出,就可以得知每個位置的自殺順序,這就是約瑟夫排列。41個人報數的約瑟夫排列如下(第一個開始對應每個人的站位):

1436138152243031634425175403161826737198352792032104121112839122233132923

由上可知,最后一個自殺的是在第31個位置的人,而倒數第二個自殺的要排在第16個位置,之前的人都死光了,所以他們也就不知道約瑟夫與他的朋友并沒有遵守游戲規則。

實現代碼如下:

<?php

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

define("N",41);

//參與總人數

define("M",3);

//每到3自殺一人

$man=array(0);

$count=1;

$i=0;

$pos=-1;

$alive=2;

//想救的人數

while($count<=N){

do{

$pos=($pos+1)%N;

//環狀處理

if(@$man[$pos]==0)

$i++;

if($i==M){

$i=0;

break;

}

}while(1);

$man[$pos]=$count;

$count++;

}

//截取出對應最大鍵值對應的鍵名

arsort($man);

$arr=array_slice($man,0,$alive,true);

echo"約琴夫排列:";

for($i=0;$i<N;$i++){

echo"".$man[$i];

}

echo"<br>L表示要救的".$alive."個人要放的位置:";

for($i=0;$i<N;$i++){

if(isset($arr[$i])&&$man[$i]==$arr[$i])

echo"L";

else

echo"D";

if(($i+1)%5==0)

echo"";

}

?>

程序的運行結果為

約琴夫排列:1436138152243031634425175403161826737198352792032104121112839122233132923

L表示要救的2個人要放的位置:DDDDDDDDDDDDDDDLDDDDDDDDDDDDDDLDDDDDDDDDD

22、外層循環998次,每次循環得到的$i傳入下個循環內,內部循環求解出符合$i整除$k等于0的數,如果能夠整除,那么說明$k是$i的一個因子,則用$sum累加,直到$sum+1等于$i條件成立,說明$i是一個“完數”。需要注意的是,因為$sum求解出的因子是不包括1的,所以還需要額外地加1到$sum中,并且$i的一個因子不會大于$i/2,所以內部循環判斷是否繼續循環的條件為$i/2。

實現代碼如下:

<?php

for($i=2;$i<1000;$i++){

$sum=0;

for($k=2;$k<=$i/2;$k++){

if($i%$k==0){

$sum+=$k;

}

}

if($sum+1==$i){

echo$i."";

}

}

?>

程序的運行結果為

628496

23、隊列的實現也有兩種方法,分別為采用數組來實現和采用鏈表來實現。下面分別詳細介紹這兩種方法。

下圖給出了一種最簡單的實現方式,用front來記錄隊列首元素的位置,用rear來記錄隊列尾元素往后一個位置。入隊列的時候只需要將待入隊列的元素放到數組下標為rear的位置,同時rear++,出隊列的時候只需要執行行front++即可。

實現代碼如下:

<?php

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

classqueue{

private$queueList;

private$size;

publicfunction__construct(){

$this->queueList=array();

$this->size=0;

}

//入隊操作

publicfunctionenQueue($data){

$this->queueList[$this->size++]=$data;

return$this;

}

//出隊操作

publicfunctionoutQueue(){

if(!$this->isEmpty()){

--$this->size;

$front=array_splice($this->queueList,0,1);

return$front[0];

}

returnfalse;

}

//獲取隊列

publicfunctiongetQueue(){

return$this->queueList;

}

//獲取隊頭元素

publicfunctiongetFront(){

if(!$this->isEmpty()){

return$this->queueList[0];

}

returnfalse;

}

//獲取隊尾元素

publicfunctiongetRear(){

if(!$this->isE

溫馨提示

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

評論

0/150

提交評論