某知名視頻網(wǎng)站服務商PHP工程師面試筆試真題17_第1頁
某知名視頻網(wǎng)站服務商PHP工程師面試筆試真題17_第2頁
某知名視頻網(wǎng)站服務商PHP工程師面試筆試真題17_第3頁
某知名視頻網(wǎng)站服務商PHP工程師面試筆試真題17_第4頁
某知名視頻網(wǎng)站服務商PHP工程師面試筆試真題17_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

某知名視頻網(wǎng)站服務商PHP工程師面試筆試真題17一、選擇題1.

假如何老師看到擺鐘的時間是17:32,那么此時時針與分針的最小夾角是______A.25°B.26°C.28°D.32°參考答(江南博哥)案:B[解析]首先,選定一個參考物,以12點正點刻度順時針作為參考量,首先算出時針與該參考量的偏移量,然后算出分針與該參考量的偏移量,二者相減即可求解出時針與分針的夾角。

眾所周知,時針行走一圈為360°,合12個小時,所以,時針每小時轉動的角度值為360°/12=30°,17:32的時針偏移量為30°*(5+32/60)=166°,即時針與12點正點時刻的夾角為166°。分針每走一圈為360°,合1個小時(60分鐘),所以,分針每分鐘轉動的角度值為360°/60=6°,17:32的分針偏移量為6°*32=192°。

時針與分針的差值即為所求解,192°-166°=26°。

所以,本題的答案為B。

2.

執(zhí)行如下代碼,結果是______

<?php

$a=-3;

$b=4;

echo$a|$b;

?>A.-3B.4C.-7D.1正確答案:A[解析]$a和$b通過按位或運算(|)運算時會把$a和$b分別進行二進制運算,然后把$a或$b中為1的位設為1。$a為-3,它的二進制為正數(shù)3的補碼即1100,而$b=4,二進制數(shù)為0100,所以,$a|$b等價于(1100)|(0100),它們二進制中為1的位數(shù)都設為1,得到1100,即-3,輸出得到-3。選項A正確。

所以,本題的答案為A。

3.

如何給變量$a、$b和$c賦值才能使以下程序顯示字符串“hello,World!”?______

<?php

$a=?;

$b=?;

$c=?;

if($a){

if($b&&!$c){

echo"GoodbyeCruelWbrld!";

}elseif(!$b&&!$c){

echo"Nothinghere";

}

}else{

if(!$b){

if(!$a&&(!$b&&$c)){

echo"hello,World!";

}else{

echo"GoodbyeWorld!";

}

}else{

echo"Notquite.";

}

}

?>A.false,true,falseB.true,true,falseC.false,true,trueD.false,false,true正確答案:D[解析]因為“hello,World!”在if($a)的else語句里面,所以$a需要為false才能執(zhí)行else語句里面的內(nèi)容。在else中,由于“hello,World!”在if(!Sb)條件里面,說明!$b需要為真,而$b前面有個非運算符,說明$b為false。而“hello,World!”在if(!$a&&(!$b&&$c))中,說明條件!$a&&(!$b&&$c)應該為真,“&&”運算符要求必須每個條件都為true才返回true,所以,代入$a=$b=false,可以得到$c為true。選項D正確。

所以,本題的答案為D。

4.

以下程序的運行結果是______

functionsort_my_array($array){

returnsort($array);

}

$al=array(3,2,1);

var_dump(sort_my_array(&$a1));A.NULLB.0=>1,1=>2,2=>3C.一個引用錯誤D.2=>1,1=>2,0=>3E.bool(true)正確答案:C[解析]通過sort_my_array(&$a1)將數(shù)組$a1的引用傳遞到sort_my_array()函數(shù)中排序,這種寫法在PHP5.3版本及以前是支持這樣的格式的,sort()函數(shù)排序成功會返回true,失敗會返回false。而returnsort($array)返回的是排序后的結果值true,所以var_dump()打印后得到的是bool(true)。但是PHP5.3以后的版本已經(jīng)廢除這樣的寫法,如果在PHP5.3以后的版本中使用這種方法,那么將會報致命錯誤。因此,不建議再使用這種方式值的引用。選項C正確。

所以,本題的答案為C。

5.

考慮如下腳本,標記處應該添加什么代碼才能讓腳本輸出字符串php?______

<?php

$alpha='abcdefghijklmnopqrstuvwxyz';

$letters=array(15,7,15);

foreach($lettersas$val){

/*這里應該加入什么*/

}

?>A.echochr($val);B.echoasc($val);C.echosubstr($alpha,$val,2);D.echo$alpha[$val];E.echo$alpha[$val+1]正確答案:D[解析]對于選項A,chr()函數(shù)可以從指定的ASCII值中返回對應的字符串。而PHP字符串對應的ASCII碼并不是15,7,15。選項A錯誤。

對于選項B,PHP中不存在asc()函數(shù)。選項B錯誤。

對于選項C,substr()函數(shù)可以返回字符串的一部分,substr($alpha,$val,2)的意思是,在$alpha字符串的$val位置中取2個字符串,最后取出來的值是pqhipq不是php。選項C錯誤。

對于選項D,因為PHP是弱類型語言,可以把字符串看成數(shù)組進行取值,剛好15對應$alpha中的p,7對應h,所以最終可以輸出php。選項D正確,選項E錯誤。

所以,本題的答案為D。

6.

以下程序的運行結果是______

<?php

classa{

functiona(){

echo'parentcalled';

}

}

classb{

functionb(){

}

}

$c=newb();

?>A.parentcalledB.一個錯誤C.一個警告D.什么都沒有正確答案:D[解析]因為類名和函數(shù)名都為b,所以函數(shù)b等價于構造函數(shù),當實例化b時,執(zhí)行函數(shù)b,因為函數(shù)b的函數(shù)體為空,所以最后結果什么都沒有。選項D正確。

所以,本題的答案為D。

7.

setcookie("vipname","tom",time()+1000);以下有關上述代碼的描述中,錯誤的是______A.該代碼設置了一個變量名為vipname的CookieB.該代碼設置了一個變量值為tom的CookieC.該變量的存活期限為1000sD.該變量的存活期限為1s正確答案:D[解析]setcookie()的語法為setcookie(變量名,變量值,有效期),對應的是變量名為vipname,變量值為tom,有效期的單位為s,所以為當前時間加上1000s而不是1s。選項D正確。

所以,本題的答案為D。

8.

以下是一個類的聲明,對成員屬性正確的賦值方式是______

<?php

classTest{

private$a;

static$b;

functionsetA($a){

$this->a=$a;

}

}

$test=newtest();

?>A.$test->a="abc";B.Test::$b="abc";C.Test::setA("abc");D.$test->b="abc";正確答案:B[解析]對于選項A,因為$a是私有方法,所以不能在外部執(zhí)行賦值操作。選項A錯誤。

對于選項B,要對類中的靜態(tài)常量賦值可以使用“類名::變量”的形式賦值,可以對成員屬性$b賦值。選項B正確。

對于選項C,因為setA()函數(shù)不是一個靜態(tài)函數(shù),所以不能使用Test::setA()的格式在類外調(diào)用函數(shù),可以使$test->setA("abc")的方式調(diào)用函數(shù)。選項C錯誤。

對于選項D,因為$b是靜態(tài)變量,所以不能使用$this->b方式賦值,賦值方式應該為Test::$b="abc"。選項D錯誤。

所以,本題的答案為B。

9.

運算符“^”的作用是______A.無效B.乘方C.位非D.位異或正確答案:D[解析]PHP中的“^’表示位異或運算符。選項D正確。

所以,本題的答案為D。

10.

在忽略瀏覽器bug的正常情況下,如何用一個與先前設置的域名(domain)來訪問新域名中的某個Cookie?______A.通過HTTPREMOTECOOKIE訪問B.不可能C.在調(diào)用setcookie()時設置一個不同的域名D.向瀏覽器發(fā)送額外的請求E.使用Javascript,把Cookie包含在URL中發(fā)送正確答案:B[解析]domain表示的是Cookie所在的域,默認為請求的地址,如網(wǎng)址為/index.php/index/hello,那么domain默認為。對于Cookie的跨域名訪問只支持同域名下的多級域名訪問,如域A為,域B為,那么域名A和域名B共同訪問域名A或域名B生成的Cookie,它們的domain都要設置為.才行。而如果要在域A中生成一個域名B不能訪問的Cookie,那么只需要將Cookie的domain設置為。

如果先前設置了一個域名domain,讓新域名訪問,那么會存在新域名不在domain的范圍內(nèi),domain的Cookie不能被新域名訪問。選項B正確。

所以,本題的答案為B。

二、填空題1.

Cookie的值存儲在______。正確答案:客戶端。

2.

______函數(shù)能讓服務器輸出header:set-Cookie:foo=bar。正確答案:setcookie()或setrawCookie()。[解析]由這個header頭里面的信息set-Cookie知道是對Cookie進行設置,所以可以通過setcookie()或setrawCookie()函數(shù)輸出HTTP發(fā)送Cookie的信息。

3.

讓類中的某些方法無法在類的外部或繼承訪問的方法是______。正確答案:private。

4.

如果在PHP中使用Oracle數(shù)據(jù)庫作為數(shù)據(jù)庫服務器,那么應該在PDO中加載______驅動程序。正確答案:PDO_OCI。[解析]PDO_OCIisadriverthatimplementsthePHPDataObjects(PDO)interfacetoenableaccessfromPHPtoOracledatabasesthroughtheOCIlibrary。

5.

POST和GET傳輸?shù)淖畲笕萘糠謩e是______和______。正確答案:POST默認是2MB,php.ini可設置,GET是1KB。[解析]GET是通過URL提交數(shù)據(jù)的,因此,GET可提交的數(shù)據(jù)量就跟URL所能達到的最大長度有直接關系。URL不存在參數(shù)上限的問題,HTTP協(xié)議規(guī)范也沒有對URL長度進行限制。IE對URL長度的限制是2083B(2KB+35B)。對于其他瀏覽器,例如,F(xiàn)ireFox、Netscape等,則沒有長度限制,這個時候其限制取決于服務器的操作系統(tǒng)。即如果url太長,那么服務器可能會因為安全方面的設置從而拒絕請求或者發(fā)生不完整的數(shù)據(jù)請求。

理論上講,POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進行大小限制,但實際上,POST所能傳遞的數(shù)據(jù)量大小取決于服務器的設置和內(nèi)存大小。對于PHP語言而言,上傳文件涉及的參數(shù)PHP默認的上傳上限為2MB,更改這個值需要更改php.conf的post_max_size這個值。

三、簡答題1.

sort()函數(shù)、asort()函數(shù)和ksort()函數(shù)有什么區(qū)別?它們分別在什么情況下使用?正確答案:sort()函數(shù)對索引數(shù)組的鍵值進行升序排序并且不保留鍵名,鍵值為字母時按26字母的順序進行排序。

asort()函數(shù)對關聯(lián)數(shù)組的鍵值進行升序排序并且保留鍵名,鍵值為數(shù)字時按升序進行排序。

ksort()函數(shù)對關聯(lián)數(shù)組按照鍵名進行升序排序并且保留鍵名,對一個數(shù)組排序使用。ksort()函數(shù)時,關聯(lián)數(shù)組的鍵名主要按照26個字母的順序進行升序排序。

它們的使用情況為,如果對索引數(shù)組進行升序排序,不考慮保留原數(shù)組順序鍵名時,那么可以使用sort()函數(shù)進行排序。如果是對關聯(lián)數(shù)組進行升序排序,需要按鍵值進行升序排序,那么可以使用asort()函數(shù),如果需要按鍵名進行升序排序,那么可以使用ksort()函數(shù)。

2.

談談你對Cookie與Session的理解,它們的適用場景是什么?正確答案:Cookie和Session都是用來解決HTTP無狀態(tài)協(xié)議存在的問題而產(chǎn)生的,為了保證從一個網(wǎng)頁到另一個網(wǎng)頁跳轉時可以知道是同一個用戶進行操作。網(wǎng)站可以通過Cookie或Session識別用戶并給予相關的權限和顯示內(nèi)容。Cookie主要存儲在客戶端,大小不能超過4KB,安全性沒有Session高。Session主要存儲在服務端,存儲大小沒有限制且可以存儲比較復雜的數(shù)據(jù)類型,由于數(shù)據(jù)存儲在服務器端,因此安全性較高。但是Session依賴于Cookie存儲SessionID,所以如果禁用了Cookie,那么Session沒有辦法正常工作。

它們的適用場景有:

1)用戶登錄時記住用戶信息和用戶登錄狀態(tài),鎖定用戶給予相關的信息顯示和權限。

2)購物車中的商品歸屬,可以鎖定商品信息歸屬對應的客戶。

3.

如何設計或配置MySQL,才能達到高效使用的目的?正確答案:1)數(shù)據(jù)庫設計方面,設計結構良好的數(shù)據(jù)庫,允許部分數(shù)據(jù)冗余。

2)選取最適用的字段屬性,盡可能把字段設置為NOTNULL,這樣在查詢的時候,數(shù)據(jù)庫不用去比較NULL值。

3)系統(tǒng)架構設計方面,進行表散列,把海量數(shù)據(jù)散列到幾個不同的表里面,進行集群,數(shù)據(jù)庫查詢和寫入分開。

4)編寫高效SQL語句,以提高效率。

5)使用連接(JOIN)來代替子查詢。

6)使用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表。

7)必要的時候用不同的存儲引擎,比如InnoDB可以減少死鎖,HEAP可以提高一個數(shù)量級的查詢速度。

8)合理使用事務、外鍵和索引。

4.

如果頁面字符出現(xiàn)亂碼,那么該怎么解決?正確答案:1)首先查看當前文件是否設置了字符集。如果是HTML頁面,那么查看meta標簽中是否存在charset設置文件字符集,如果是PHP頁面,那么可以查看是否在header()函數(shù)中指定了charset設置文件字符集。

例如,header("content-type:text/html;charset=utf-8");,可以通過該函數(shù)設置網(wǎng)站編碼。

2)如果通過方法1)發(fā)現(xiàn)已經(jīng)設置了字符集,那么接下來需要判斷當前文件保存的編碼格式是否與頁面設置的字符集保持一致,如果不一致,那么需要修改保證兩者字符集統(tǒng)一。

3)如果是從數(shù)據(jù)庫取數(shù)據(jù)出現(xiàn)的亂碼,那么需要查看數(shù)據(jù)庫查詢時設置的字符集與當前頁面設置的字符集是否一致,并保證兩者字符集統(tǒng)一。對數(shù)據(jù)庫取值設置編碼的方法為mysql_query("setnamesutf8")。

5.

與數(shù)組相關的常用函數(shù)有哪些?正確答案:與數(shù)組相關的常用函數(shù)主要有以下幾個:

1)count()函數(shù),用于計算數(shù)組中的元素數(shù)量,sizeof()函數(shù)是count()函數(shù)的別名。

2)sort()函數(shù),用于數(shù)組對鍵值進行升序排序。

3)in_array()函數(shù),用于檢查數(shù)組中是否存在某個鍵值。

4)explode()函數(shù)和implode()函數(shù),用于數(shù)組與字符串相互轉換。

explode()函數(shù),通過使用一個分隔符對字符串進行切割,返回一個數(shù)組。例如,通過逗號對字符串進行分割成數(shù)組:$arr=implode(",",$String)。

implode()函數(shù),通過設定一個連接符,將數(shù)組中的每個元素連接為一個字符串。例如,通過逗號對每個鍵值進行分隔拼接成字符串:implode(",","$array")。

5)array_merge()函數(shù),可以將一個或多個數(shù)組的元素合并成一個數(shù)組,一個數(shù)組的值附加在前一個數(shù)組的后面,返回合并后的數(shù)組。但是需要注意,如果合并的數(shù)組中存在相同的字符串鍵名,那么后一個數(shù)組的鍵值會覆蓋前一個數(shù)組的鍵值。但是,如果是數(shù)字的數(shù)組鍵名,那么不存在后一個數(shù)組鍵值覆蓋前一個數(shù)組鍵值的情況。

6)array_unique()函數(shù),用于移除數(shù)組中重復的值,并返回去除重復鍵值后的數(shù)組。

7)array_shift()函數(shù),用于刪除數(shù)組中的第一個值,并且返回被刪除元素的值。

8)array_unshift()函數(shù),用于向數(shù)組的開頭插入新元素。

9)array_push()函數(shù),用于向數(shù)組的尾部插入一個或多個元素(入棧),然后返回數(shù)組的長度。

10)array_pop()函數(shù),用于刪除數(shù)組中的最后一個元素(出棧)。

11)array_reverse()函數(shù),用于把數(shù)組的鍵值反向排序并返回數(shù)組。

四、編程題1.

寫一個PHP函數(shù)實現(xiàn)對array(12,34,9,68,26,95,6,118)的從小到大排序。正確答案:可以使用快速排序的算法對數(shù)組進行從小到大的排序。

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

<?php

$arr=array(12,34,9,68,26,95,6,118);

functionquick_sort($arr){

$length=count($arr);

if($length<=1){

return$arr;

$base_num=$arr[0];

$left=array();

$right=array();

for($i=1;$i<$length;$i++){

if($base_num>$arr[$i]){

$left[]=$arr[$i];

}else{

$right[]=$arr[$i];

}

}

$left=quick_sort($left);

$right=quick_sort($right);

returnarray_merge($left,array($base_num),$right);

}

$newArr=quick_sort($arr);

print_r($newArr);

}

?>

程序的運行結果為

Array([0]=>6[1]=>9[2]=>12[3]=>26[4]=>34[5]=>68[6]=>95[7]=>118)

快速排序的時間復雜度最佳情況:T(n)=O(nlogn),最差情況:T(n)=O(n2),平均情況:T(n)=O(nlogn)。

2.

請寫出將兩個數(shù)組連接成一個新數(shù)組的兩種方法。正確答案:把兩個數(shù)組合并有以下幾種方法。

1)使用array_merge()函數(shù)。

array__merge()函數(shù)可以把一個或多個數(shù)組合并為一個數(shù)組,語法為array_merge($array1,$array2.......)。

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

<?php

$arr1=array(1,2,3,"b"=>"a");

$arr2=array(3,4,5,"b"=>"c");

$arr=array_merge_recursive($arr1,$arr2);

print_r($arr);

?>

程序的運行結果為Array([0]=>1[1]=>2[2]=>3[b]=>c[3]=>3[4]=>4[5]=>5)。

2)使用array_merge_recursive()函數(shù)合并。

array_merge_recursive()函數(shù)可以把一個或多個數(shù)組合并為一個數(shù)組,使用方法以及作用和array_merge()函數(shù)一樣。但是在使用array_merge()合并的數(shù)組時,如果存在相同的字符串鍵名,那么后一個數(shù)組會覆蓋前一個數(shù)組的鍵值。而使用array_merge_recursive()時,如果存在相同的字符串鍵名,那么在相同鍵名下會合并成一個新的數(shù)組。

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

<?php

$arr1=array(1,2,3,"b"=>"a");

$arr2=array(3,4,5,"b"=>"c");

$arr=array_merge_recursive($arr1,$arr2);

print_r($arr);

?>

程序的運行結果為

Array([0]=>1[1]=>2[2]=>3[b]=>Array([0]=>a[1]=>c)[3]=>3[4]=>4[5]=>5)

3)創(chuàng)建一個新的數(shù)組,把數(shù)組一和數(shù)組二壓入新數(shù)組中。

可以通過創(chuàng)建一個新的數(shù)組,對合并的數(shù)組進行遍歷依次壓入新數(shù)組中,從而合并數(shù)組。

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

<?php

$arr1=array(1,2,3,"b"=>"a");

$arr2=array(3,4,5,"b"=>"c");

$array=array();

foreach($arr1as$k=>$val){

$array[]=$val;

}

foreach($arr2as$k=>$val){

$array[]=$val;

}

print_r($array);

?>

程序的運行結果為Array([0]=>1[1]=>2[2]=>3[3]=>a[4]=>3[5]=>4[6]=>5[7]=>c)。

以上的三種方法中,方法一和方法二使用的是PHP自帶的函數(shù),方法三中需要根據(jù)兩個數(shù)組的長度依次循環(huán)多次壓入新數(shù)組中,方法一、方法二的執(zhí)行速度比方法三快。

3.

請編寫函數(shù)計算出兩個日期之間的天數(shù)。正確答案:可以首先把兩個日期轉換為時間戳,求出兩個時間戳的差值,接著用這個差值除以一天的秒數(shù)得到天數(shù)的差值,最后通過floor()函數(shù)對計算結果向下取整得到天數(shù)。

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

<?php

functionbetweenDay($day1,$day2){

$day1=strtotime($day1);

$day2=strtotime($day2);

if($day1<$day2){

$dif=$day2-$day1;

$result=$dif/(24*3600);

}else{

$result=($day1-$day2)/(24*3600);

}

returnfloor($result);

}

echobetweenDay("2017-9-5","2017-9-3");

?>

程序的運行結果為2。

4.

所謂中位數(shù)就是一組數(shù)據(jù)從小到大排列后中間的那個數(shù)字。如果數(shù)組長度為偶數(shù),那么中位數(shù)的值就是中間兩個數(shù)字相加除以2,如果數(shù)組長度為奇數(shù),那么中位數(shù)的值就是中間那個數(shù)字。正確答案:根據(jù)定義,如果數(shù)組是一個已經(jīng)排序好的數(shù)組,那么直接通過索引即可獲取到所需的中位數(shù)。如果題目允許排序,那么本題的關鍵在于選取一個合適的排序算法對數(shù)組進行排序。一般而言,快速排序的平均時間復雜度較低,為O(nlog2n),所以,如果采用排序方法,算法的平均時間復雜度為O(nlog2n)。

可是,題目要求不許使用排序算法。那么前一種方法是不可取的。此時,可以換一種思維,使用分治的思想??焖倥判蛩惴ㄔ诿恳淮尉植窟f歸后都保證某個元素左側的元素的值都比它小,右側的元素的值都比它大,因此,可以利用這個思路快速地找到第N大元素,而與快速排序算法不同的是,這個算法關注的并不是元素的左右兩邊,而僅僅是某一邊。

根據(jù)快速排序的方法,可以采用一種類似快速排序的方法,找出這個中位數(shù)來。具體而言,首先把問題轉化為求一列數(shù)中第i小的數(shù)的問題,求中位數(shù)就是求一列數(shù)的第(length/2+1)小的數(shù)的問題(其中l(wèi)ength表示的是數(shù)組序列的長度)。

溫馨提示

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

評論

0/150

提交評論