php面試題及答案,經典php筆試題與答案
問題
1. 考慮如下腳本。標記處應該添加什麼代碼才能讓腳本輸出字符串 php?
$alpha = 'abcdefghijklmnopqrstuvwxyz';
$letters = array(15, 7, 15);
foreach($letters as $val) {/* 這裏應該加入什麼 */
}
?>
A.echo chr($val);
B.echo asc($val);
C.echo substr($alpha, $val, 2);
D.echo $alpha{$val};
E.echo $alpha{$val+1}
2. 以下哪一項不能把字符串$s1 和$s2 組成一個字符串?
A.$s1 + $s2
B.”{$s1}{$s2}”
C.$s1.$s2
D.implode(”, array($s1,$s2))
E.以上都可以
3. 變 量 $email 的 值 是 字 符 串 [email protected] , 以 下 哪 項 能 把 字 符 串 轉 化 成
example.com?
A.substr($email, strpos($email, “@”));
B.strstr($email, “@”);
C.strchr($email, “@”);
D.substr($email, strpos($email, “@”)+1);
E.strrpos($email, “@”);
4. 給定一個用逗號分隔一組值的字符串,以下哪個函數能在僅調用一次的情況下就把每
個獨立的值放入一個新創建的數組?
A.strstr()
B.不可能只調用一次就完成
C.extract()
D.explode()
E.strtok()
5. 要比較兩個字符串,以下那種方法最萬能?
A.用 strpos 函數
B.用==操作符
C.用 strcasecmp()
D.用 strcmp()
6. 以下哪個 PCRE 正則表達式能匹配字符串 php|architect?
A..*
B.…|………
C.\d{3}\|\d{8}
D.[az]{3}\|[az]{9}
E.[a-z][a-z][a-z]\|\w{9}
7. 以下哪些函數能用來驗證字符串的完整性?(三選)
A.md5()
B.sha1()
C.str_rot13()
D.crypt()
E.crc32()
8. 哪個 PHP 函數與以下腳本在 UNIX 系統下執行的效果近似?
function my_funct ($filename)
{
$f = file_get_contents ($filename);
return explode ("\n", $f);
}
?>
A.fopen()
B.fread()
C.flock()
D.split_string()
E.file()
9. 基於指定的式樣(pattern)把一個字符串分隔開並放入數組,以下哪些函數能做到?(雙
選)
A.preg_split()
B.ereg()
C.str_split()
D.explode()
E.chop()
10.以下腳本輸出什麼?
echo 'Testing ' . 1 + 2 . '45';
?>
A.Testing 1245
B.Testing 345
C.Testing 1+245
D.245
E.什麼都沒有
11.以下腳本輸出什麼?
$s = '12345';
$s[$s[1]] = '2';
echo $s;
?>
A.12345
B.12245
C.22345
D.11345
E.Array
12.方框中的正則表達式能與以下哪些選項匹配?(雙選)
/.*\*123\d/
A.******123
B.*****_1234
C.******1234
D._*1234
E._*123
13.以下哪個比較將返回 true?(雙選)
A.’1top’ == ’1′
B.’top’ == 0
C.’top’ === 0
D.’a’ == a
E.123 == ’123′
14.如果用+操作符把一個字符串和一個整型數字相加,結果將怎樣?
A.解釋器輸出一個類型錯誤
B.字符串將被轉換成數字,再與整型數字相加
C.字符串將被丟棄,只保留整型數字
D.字符串和整型數字將連接成一個新字符串
E.整形數字將被丟棄,而保留字符串
15.考慮如下腳本。假設 http://www.php.net 能被訪問,腳本將輸出什麼?
$s = file_get_contents ("http://www.php.net");
strip_tags ($s, array ('p'));
echo count ($s);
?>
A.www.php.net 的主頁的字符數
B.剔除
標籤後的 www.php.net 主頁的字符數
C.1
D.0
E.剔除
以外的標籤後的 www.php.net 主頁的字符數
16.哪個函數能不區分大小寫得對兩個字符串進行二進制比對?
A.strcmp()
B.stricmp()
C.strcasecmp()
D.stristr()
E.以上都不能
17.以下哪些函數能把字符串裏存儲的二進制數據轉化成十六進制?(雙選)
A.encode_hex()
B.pack()
C.hex2bin()
D.bin2hex()
E.printf()
18.哪個函數能用來確保一個字符串的字符數總是大於一個指定值?
答案:____________
19.以下腳本輸出什麼?
$a = 'able osts indy';
echo wordwrap ($a, 1, "c", false);
?>
答案:____________
20.以下腳本輸出什麼?
$x = 'apple';
echo substr_replace ($x, 'x', 1, 2);
?>
A.x
B.axle
C.axxle
D.applex
E.xapple
答案
1. substr 函數能夠勝任,但考慮到輸出三個字母就需要三次調用該函數,所以排除此方法。
那麼$alpha{$val}和$alpha{$val+1}是僅有的兩個可能輸出題目要求的字符串的選項。因
爲 0 是數組的第一個索引,所以答案是 D。
2. 除了 A 以外的選項都能輸出題目要求的字符串。PHP 中,加號(+)不能把兩個字符
串合併成一個。
3. substr 函數返回字符串的一部分,而 strpos 函數擅長從一個字符串中找出某個指定的子
串。同時使用這兩個函數將滿足題目要求。注意,前一個函數從 0 開始索引,而後者
不是,因此需要+1。答案是 D。
4. 答案是 D。explode 函數使用一個字符串分隔另一個字符串,並把結果放入一個新建的
數組。strtok 函數也可以做同樣的事,但需要多次調用。
5. 答案是 D。strcmp()提供了安全的字符串比較機制。注意,選項 C 是錯的,strcasecmp()
不是一個“萬能”函數,因爲它不區分大小寫。
6. 選項中沒有一個正則表達式能真正代表題目所給字符串的匹配方式,但是選項 A 和 E
仍然能勉強匹配。選項 A 太普通了,它能夠匹配任何字符串,因此答案是 E。
7. 正確答案是 A,B 和 E。用 crypt()和 str_rot13()來驗證一個字符串是否被改變,效率很
低。crc32()比前面兩個函數好些,如果能容忍一些小錯誤的話,它是個不錯的選擇。
8. file 函數將文件的文本內容讀入一個數組,每個元素是一行。因此答案 E 正確。也許你
想知道爲什麼要把這樣一個題目放在講字符串的章節中,那是爲了提醒你每一章的題
目所包含的知識點並不是絕對嚴格區分開的,正如寫 PHP 腳本時,file 函數不能脫離
字符串函數單獨存在一樣。
9. 儘管條件不同,但 preg_split 和 explode 函數都能滿足題目要求。ereg()拿一個正則表達
式匹配一個字符串;str_split()按固定長度分隔字符串;而 chop()則是 rtrim()別名,用來
移除字符串末尾處的空格。
10.本題考察你對字符串操作及操作符優先級的認識。連接運算符(.)的優先級比加號(+)
高。因此 PHP 解釋器實際執行的運算可以表示爲(‘Testing ‘ . 1) + (2 . ’45′)。由於字符串
test 1 不是數字,所以加號前面的運算等於 0。加號後面的運算等於 245,PHP 輸出的
結果是 0+245,等於 245,所以答案是 D。
11.可以用訪問數組元素的方式訪問字符串中的字符,因此腳本只是把字符串中的第二個
字符($s[1])替換成了字符 2,最終將輸出 12245。答案是 B。
12.本題的要點是理解這個正則表達式的含義——從左往右,首先是零個或多個任意字符
(.*),跟着是一個星號(\*),然後是 123,最後是一個數字。因此答案是 C 和 D。
13.B 和 E 正確。選項 B 中,在比較時,字符串 top 等同於數字 0。==操作符不比對數據
類型,所以將返回 true。答案 E 中,字符串 123 等同於數字 123,比較將返回 true。
14.字符串將被轉換成數字(如果無法發生轉換就是 0),然後與整型數字相加。答案是 B。
15.代碼的本意是剔除 www.php.net 主頁上除了 p 以外的的所有 HTML 標籤。可實際上,
在代碼的最後一行使用了 count 函數,它統計變量中的元素數量,而不是字符串中的字
符數。由於字符串是標量,對字符串使用 count 函數將永遠返回 1。答案是 C。
16.題目其實就是在描述 strcasecmp 函數的作用,因此答案是 C。
17.正確答案是 B 和 D。pack 函數能對二進制數據進行復雜的格式化,包括將字符串中的
字符轉化成十六進制表示。bin2hex 函數也有同樣的轉化功能。注意,printf()能將整數
轉化成十六進制數,但無法轉化字符串。
18.這是在說 str_pad 函數,它可以把字符串填充到指定長度。
19.腳本將輸出 ablecostscindy。wordwrap 函數通常用來把字符串切割成指定長度。然而在
本題中,長度被設置爲 1,因此函數將從空格處切割(第四個參數被設置爲 false,因
此函數不會從單詞的中間進行切割)。填充字符串是 c,等於把每個空格都換成了 c。
20.substr_replace 函數是用一個指定字符串替換原字符串中的某個部分,因此腳本輸出
axle,答案是 B。
文件操作
你可能覺得PHP的文件操作功能並不怎樣,但實際上它對開發者來說非常有用。即使你
是做網站開發的,學會相關技能也能讓你如虎添翼。多虧了流包裝器(stream wrappers,將
在第十章詳細介紹),PHP才能夠打開並讀取遠程文件,讓在本地使用第三方網站的內容變
得可能。
站在更底層的角度,文件輸入/輸出能完成多種任務。可以用他讀取預製文件的內容,
比如第三方提供的內容;或者通過PHP腳本讓瀏覽器打開一個二進制文件,使得你能更切實
的控制它。無論如何,本章不僅考驗你打開、關閉和讀取文件的能力,還考查多進程下進行
文件操作的基礎知識——例如文件鎖。
php面試題及答案,經典php筆試題與答案
1. 函數______能讀取文本文件中的一行。讀取二進制文件或者其他文件時,應當使用
______函數。
A.fgets(), fseek()
B.fread(), fgets()
C.fputs(), fgets()
D.fgets(), fread()
E.fread(), fseek()
2. 文件指針能在PHP腳本結束時自動關閉,但你也可以用______函數來關閉。
答案:____________
3. 考慮如下PHP腳本,它一行一行的讀取並顯示某文本文件的內容。在問號處填入什麼才
能使腳本正常運作?
$file = fopen("test", "r");
while(!feof($file)) {
echo ????????????;
}
fclose($file);
?>
A.file_get_contents($file)
B.file($file)
C.read_file($file)
D.fgets($file)
E.fread($file)
4. 以下哪種方法能保證鎖在任何競爭情況下都安全?
A.用flock()鎖住指定文件
B.用fopen()在系統的臨時文件夾裏打開文件
C.用tempnam()創建一個臨時文件
D.用mkdir()創建一個文件夾來當
E.用tmpfile()創建一個臨時文件
5.以下哪個函數能夠獲得文件的全部內容,並能夠用在表達式中?(雙選)
A.file_get_contents()
B.fgets()
C.fopen()
D.file()
E.readfile()
6. 在不把文件內容預加載到變量中的前提下,如何解析一個以特殊格式格式化過的多行文
件?
A.用file()函數把它分割放入數組
B.用sscanf()
C.用fscanf()
D.用fgets()
E.用fnmatch()
7.考慮如下腳本,最後文件myfile.txt的內容是什麼?
$array = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$f = fopen ("myfile.txt", "r");
for ($i = 0; $i < 50; $i++) {
fwrite ($f, $array[rand(0, strlen ($array) - 1)]);
}
?>
A.什麼都沒有,因爲$array實際上是一個字符串,而不是數組
B.49個隨機字符
C.50個隨機字符
D.41個隨機字符
E.什麼都沒有,或者文件不存在,腳本輸出一個錯誤
8.函數delete是做什麼的?
A.刪除文件
B.刪除文件夾
C.釋放變量
D.移除數據庫記錄
E.沒有這個函數!
9.考慮如下腳本,哪個PHP函數和它的功能最接近?
function my_funct ($file_name, $data)
{
$f = fopen ($file_name, 'w');
fwrite ($f, $data);
fclose ($f);
}
?>
A.file_get_contents()
B.file_put_contents()
C.沒有這樣的函數
D.file()
E.fputs()
10.如果你的腳本無法正確識別一個存儲於另一個平臺上的文件的行結尾,你該怎麼辦?
A.改變auto_detect_line_ending的設置
B.用正則表達式偵測行的最後一個字母
C.用fpos()
D.用ftok()
E.每次讀取一個字符
11.如果想要可讀可寫得打開一個文件,該給fopen()傳什麼參數?(雙選)
A.w
B.r
C.a
D.+
12.能夠讀寫常規文件中的二進制數據的函數是______,該函數返回的資源能被fgets()使用。
答案:__________
13.以下哪些函數能讀取文件的全部內容?(三選)
A.fgets()
B.file_get_contents()
C.fread()
D.readfile()
E.file()
14.哪個函數能夠往文本文件中寫入一個字符串?
答案:____________
15.考慮如下腳本。運行時,儘管文件test.txt已經被用unlink()函數刪除,腳本仍然輸出1,1。
在腳本的最後添加什麼函數才能解決這個問題?
$f = fopen ("test.txt", "w");
fwrite ($f, "test");
fclose ($f);
echo (int) file_exists("test.txt") . ', ';
unlink ("c:\\test.txt");
echo (int) file_exists ("test.txt");
?>
A.clearstatcache()
B.fflush()
C.ob_flush()
D.touch()
E.以上都不對
16.函數______能判斷一個文件是否可寫。
答案:____________
17.以下哪個選項能將文件指針移到開頭?
A.reset()
B.fseek(-1)
C.fseek(0, SEEK_END)
D.fseek(0, SEEK_SET)
E.fseek(0, SEEK_CUR)
18.stat()和fstat()有什麼區別?
A.stat()基於文件指針工作,fstat()基於路徑工作
B.fstat()基於文件指針工作,stat()基於路徑工作
C.fstat()不能處理文件
D.stat()不能處理文件
E.fstat()是stat()的別名
19.以下哪個選項準確的描述出了方框中的腳本的作用?
echo number_format (disk_free_space ('c:\\') /
disk_total_space('c:\\') * 100, 2) . '%';
?>
A.計算Windows系統C盤的剩餘磁盤空間大小
B.輸出一個表示C盤剩餘空間所佔比例的兩位小數
C.輸出C盤剩餘容量的byte數
D.計算C盤總容量與剩餘空間的比率
E.以上都不對
20.假設image.jpg存在並能夠被PHP讀取,調用以下腳本時,瀏覽器上顯示什麼?
header ("Content-type: image/jpeg");
?>
readfile ("image.jpg");
?>
A.一張JPEG圖片
B.一個二進制文件
C.下載一個二進制文件
D.下載一張JPEG圖片
E.一張殘破的圖片
答案
1. fgets函數主要用來從文本文件中讀取一行,當然你也可以指定每次讀取的最大長度。
fread函數主要用來讀取二進制數據。答案是D。
2. 函數fclose能關閉文件指針。
3. fgets函數能從文件中讀取單獨一行。因此答案是D。
4. 正確答案是D。這題很難,而且在實踐中不大可能會碰到這樣的問題——但這不正是你
讀這本書的原因嗎?!你必須記住,flock()使用一種“協議”鎖定機制,即所有其他訪
問此文件的進程也必須要使用flock()。如果某個進程沒有這麼做,競爭就會產生,鎖就
不安全。用mkdir創建一個文件夾能保證任何時刻只有一個進程處理能處理某文件,即
保證操作的原子性。因此,你可以創建一個臨時文件夾並“護”住它,直到I/O操作完成。
5. 只有file_get_contents和file函數返回文件的全部內容,因此答案是A和D。readfile函數也
能讀取文件的全部內容,但它直接把內容送入了輸出緩存,因此不能用在表達式中。
6. fscanf函數能根據指定格式解析文件內容,因此答案是C。sscanf函數只能用來操作字符
串。
7. 答案是E。注意,文件被以r模式打開,即只讀模式。因此,如果文件不存在,PHP將輸
出一個錯誤來指出沒有找到文件。如果文件存在,fopen()將被成功調用,但由於是以只
讀方式打開,fwrite()會失敗。如果我們用w代替r,腳本就能正常運行,並且myfile.txt
內將有50個隨機字符(記住,可以像訪問數組那樣使用索引來訪問字符串)。
8. 答案是E。PHP裏沒有叫delete()的函數。刪除文件用unlink(),刪除文件夾用rmdir(),數
據庫記錄用SQL語句刪除,釋放變量用unset()。
9. 腳本實現的功能與file_put_contents()最接近,但這個函數直到PHP5才被引入,因此答案
是C。
10.PHP4.3.0開始,php.ini引入了auto_detect_line_endings設置,系統在保存文本文件時能夠
自動偵測行結束符號的類型,因此答案是A。
11.要可讀可寫的打開文件,你必須使用r+模式,因此答案是B和D。
12.這是在說fopen()函數。
13.正確答案是B,D和E。file,readfile和file_get_contents都能讀取文件的全部內容。
14.fwrite()和fputs()兩個函數在這裏都可以,而後者其實是前者的別名。在PHP中,寫入二
進制數據和寫入字符串沒有區別。
15.PHP會緩存某些文件系統函數的返回值——包括file_exists(),這樣能提高腳本處理重複
操作時的效率。當腳本里有大量刪除文件的操作時,緩存很容易就會過時,因此需要清
理緩存。答案是A。
16.這是在說is_writeable函數,它返回一個表示文件是否可寫的布爾值。
17.正確答案是D。fseek()用來移動文件指針。SEEK_SET指出偏移量從文件開頭開始計算。
如果沒有特別指出,SEEK_SET就是fseek()的默認模式。注意,rewind函數等效於
fseek(0,SEEK_SET)。
18.答案是B。fstat函數通過已打開的文件指針取得文件信息,stat()獲取指定路徑的文件信
息。
19.正確答案是B。disk_free_space函數能確定指定設備上(本題中即Windows下的C盤)的
剩餘磁盤空間(單位是byte),而disk_total_space()能確定設備的總容量。兩者相除,再
乘以百分率,最後用number_format()保留兩位小數,腳本輸出的就是剩餘磁盤空間所佔
的比例。最後在加上百分號以防混淆。
20.答案是E。你注意到兩個代碼塊之間的空行了嗎?它將被輸出到瀏覽器上,使得整個圖
片的二進制數據出錯。因此瀏覽器將顯示一個破碎的圖片(或者是一條信息,指出圖片
出錯)。 譯者注:原文中兩個代碼塊之間並沒有空行,而在我添加了空行之後,也沒有
調試出答案中描述的情況。)
管理
日期與時間
從某一點上來看,幾乎所有的網站都需要處理日期與時間。假如你需要收集用戶的生
日,或者記錄某個特定事件的發生時間,PHP 的日期函數將很好的幫助你完成任務。
但是 PHP 的日期/時間管理功能並不完美。它基於 UNIX 時間戳運行,容易受到攻擊,
作爲開發者,你必須謹慎處理可能遇到的惡意數據。
同時,在 Web 上進行日期管理是一件國際性的事務。你必須能依據時區、地區的不同
來顯示對應的日期信息。