php程序員面試題(附答案)
PHP經(jīng)典面試題(連載4).
1請(qǐng)說(shuō)明PHP中傳值與傳引用的區(qū)別。什么時(shí)候傳值什么時(shí)候傳引用?
答:傳值只是把某一個(gè)變量的值傳給了另一個(gè)變量,而引用則說(shuō)明兩者指向了同一個(gè)地方。
2在PHP中error_reporting這個(gè)函數(shù)有什么作用?
答:Theerror_reporting()functionsetstheerror_reportingdirectiveatruntime.PHPhasmanylevelsoferrors,usingthisfunctionsetsthatlevelfortheduration(runtime)ofyourscript.
3請(qǐng)用正則表達(dá)式(RegularExpression)寫(xiě)一個(gè)函數(shù)驗(yàn)證電子郵件的格式是否正確。答:}}else{?>
EMAIL檢測(cè)functioncheckEmail(sText){
varreg=/^(?:w+.?)*w+@(?:w+.?)*w+$/;
varemail=document.getElementById(sText).value;if(!reg.test(email)){
alert("電子郵件檢測(cè)失敗");}else{
alert("電子郵件格式正確");}}
電子郵件:
4簡(jiǎn)述如何得到當(dāng)前執(zhí)行腳本路徑,包括所得到參數(shù)。
5有一個(gè)一維數(shù)組,里面存儲(chǔ)整形數(shù)據(jù),請(qǐng)寫(xiě)一個(gè)函數(shù),將他們按從大到小的順序排列。要求執(zhí)行效率高。并說(shuō)明如何改善執(zhí)行效率。(該函數(shù)必須自己實(shí)現(xiàn),不能使用php函數(shù))}
$test=array(1,3,6,8,2,7);BubbleSort($test);var_dump($test);?>
6請(qǐng)舉例說(shuō)明在你的開(kāi)發(fā)過(guò)程中用什么方法來(lái)加快頁(yè)面的加載速度
答:要用到服務(wù)器資源時(shí)才打開(kāi),及時(shí)關(guān)閉服務(wù)器資源,數(shù)據(jù)庫(kù)添加索引,頁(yè)面可生成靜態(tài),圖片等大文件單獨(dú)服務(wù)器。使用代碼優(yōu)化工具啦
擴(kuò)展閱讀:php程序員面試題(b卷 附答案)
1.以下哪一句不會(huì)把John新增到users陣列?$users[]="john";
成功把John新增到陣列users。array_add($users,john);函式array_add()無(wú)定義。array_push($users,john);
成功把John新增到陣列users。$users||="john";語(yǔ)法錯(cuò)誤。
2.sort()、assort()、和ksort()有什么分別?它們分別在什么情況下使用?sort()
根據(jù)陣列中元素的值,以英文字母順序排序,索引鍵會(huì)由0到n-1重新編號(hào)。主要是當(dāng)陣列索引鍵的值無(wú)關(guān)疼癢時(shí)用來(lái)把陣列排序。assort()
PHP沒(méi)有assort()函式,所以可能是asort()的筆誤。asort()
與sort()一樣把陣列的元素按英文字母順序來(lái)排列,不同的是所有索引鍵都獲得保留,特別適合替聯(lián)想陣列排序。ksort()
根據(jù)陣列中索引鍵的值,以英文字母順序排序,特別適合用于希望把索引鍵排序的聯(lián)想陣列。3.以下的代碼會(huì)產(chǎn)生什么?為什么?$num=10;
functionmultiply(){$num=$num*10;}
multiply();echo$num;
由于函式multiply()沒(méi)有指定$num為全域變量(例如global$num或者$_GLOBALS["num"]),所以$num的值是10。
4.reference跟一個(gè)正規(guī)的變量有什么分別?如何passbyreference?在什么情況下我們需要這樣做?
Reference傳送的是變量的地址而非它的值,所以在函式中改變一個(gè)變量的值時(shí),整個(gè)應(yīng)用都見(jiàn)到這個(gè)變量的新值。
一個(gè)正規(guī)變量傳送給函式的是它的值,當(dāng)函式改變這個(gè)變量的值時(shí),只有這個(gè)函式才見(jiàn)到新值,應(yīng)用的其他部分仍然見(jiàn)到舊值。
$myVariable="its"value";
Myfunction(&$myVariable);//以reference傳送參數(shù)以reference傳送參數(shù)給函式,可以使函式改變了的變量,即使在函式結(jié)束后仍然保留新值。5.些函式可以用來(lái)在現(xiàn)正執(zhí)行的腳本中插入函式庫(kù)?
對(duì)這道題目不同的理解會(huì)有不同的答案,我的第一個(gè)想法是插入PHP函式庫(kù)不外乎include()、include_once()、require()、require_once(),但細(xì)心再想,“函式庫(kù)”也應(yīng)該包括com物件和.net函式庫(kù),所以我們的答案也要分別包括com_load和dotnet_load,下次有人提起“函式庫(kù)”的時(shí)候,別忘記這兩個(gè)函式。6.foo()與@foo()有什么分別?
foo()會(huì)執(zhí)行這個(gè)函式,任何解譯錯(cuò)誤、語(yǔ)法錯(cuò)誤、執(zhí)行錯(cuò)誤都會(huì)在頁(yè)面上顯示出來(lái)。@foo()在執(zhí)行這個(gè)函式時(shí),會(huì)隱藏所有上述的錯(cuò)誤訊息。
很多應(yīng)用程式都使用@mysql_connect()和@mysql_query來(lái)隱藏mysql的錯(cuò)誤訊息,我認(rèn)為這是很?chē)?yán)重的失誤,因?yàn)殄e(cuò)誤不該被隱藏,你必須妥善處理它們,可能的話解決它們。7.你如何替PHP的應(yīng)用程式偵錯(cuò)?
我并不常這樣做,我曾經(jīng)試過(guò)很多不同的偵錯(cuò)工具,在Linux系統(tǒng)中設(shè)定這些工具一點(diǎn)也不容易。不過(guò)以下我會(huì)介紹一個(gè)近來(lái)頗受注目的偵錯(cuò)工具。
PHP-AdvancedPHPDebugger或稱(chēng)PHP-APD,第一步是執(zhí)行以下的指令安裝:pearinstallapd安裝后在你的腳本的開(kāi)頭位置加入以下的語(yǔ)句開(kāi)始進(jìn)行偵錯(cuò):apd_set_pprof_trace();執(zhí)行完畢,打開(kāi)以下檔案來(lái)查閱執(zhí)行日志:apd.dumpdir
你也可以使用pprofp來(lái)格式化日志。
詳細(xì)的資料可以參閱。8.“===”是什么?試舉一個(gè)“==”是真但“===”是假的例子!===”是給既可以送回布爾值“假”,也可以送回一個(gè)不是布爾值但卻可以賦與“假”值的函式,strpos()和strrpos()便是其中兩個(gè)例子。
問(wèn)題的第二部份有點(diǎn)困難,想一個(gè)“==”是假,但是“===”是真的例子卻很容易,相反的例子卻很少。但我終于找到以下的例子:
if(strpos("abc","a")==true){//這部分永不會(huì)被執(zhí)行,因?yàn)?a"的位置是0,換算成布爾值“假”}if(strpos("abc","a")===true){//這部份會(huì)被執(zhí)行,因?yàn)椤?==”保證函式strpos()的送回值不會(huì)換算成布爾值.}
9.你會(huì)如何定義一個(gè)沒(méi)有成員函式或特性的類(lèi)別myclass?classmyclass{}
10.你如何產(chǎn)生一個(gè)myclass的物件?$obj=newmyclass();
11.在一個(gè)類(lèi)別內(nèi)如何存取這個(gè)類(lèi)別的特性及變改它的值?使用語(yǔ)句:$this->propertyName,例如:
classmyclass{private$propertyName;publicfunction__construct(){$this->propertyName="value";}}
12.include和include_once有什么分別?require又如何?
三者都是用來(lái)在腳本中插入其他檔案,視乎url_allow_fopen是否核準(zhǔn),這個(gè)檔案可以從系統(tǒng)內(nèi)部或外部取得。但他們之間也有微細(xì)的分別:
include():這個(gè)函式容許你在腳本中把同一個(gè)檔案插入多次,若果檔案不存在,它會(huì)發(fā)出系統(tǒng)警告并繼續(xù)執(zhí)行腳本。
include_once():它跟include()的功能相似,正如它的名字所示,在腳本的執(zhí)行期間,有關(guān)檔案只會(huì)被插入一次。
require():跟include()差不多,它也是用來(lái)在腳本中插入其他檔案,但若果檔案不存在,它會(huì)發(fā)出系統(tǒng)警告,這個(gè)警告會(huì)引致致命錯(cuò)誤令腳本中止執(zhí)行13.以下哪一個(gè)函式可以把瀏覽器轉(zhuǎn)向到另一個(gè)頁(yè)面?redir()
這不是一個(gè)PHP函式,會(huì)引致執(zhí)行錯(cuò)誤。header()
這個(gè)是正確答案,header()用來(lái)插入卷頭資料,可以用來(lái)使瀏覽器轉(zhuǎn)向到另一個(gè)頁(yè)面,例如:header("Location:-this.com/");location()
這不是一個(gè)PHP函式,會(huì)引致執(zhí)行錯(cuò)誤。redirect()
這不是一個(gè)PHP函式,會(huì)引致執(zhí)行錯(cuò)誤。
14.以下哪一個(gè)函式可以用來(lái)開(kāi)啟檔案以便讀/寫(xiě)?fget()
這不是一個(gè)PHP函式,會(huì)引致執(zhí)行錯(cuò)誤。file_open()
這不是一個(gè)PHP函式,會(huì)引致執(zhí)行錯(cuò)誤。fopen()
這是正確答案,fopen()可以用來(lái)開(kāi)啟檔案以便讀/寫(xiě),事實(shí)上這個(gè)函式還有很多選項(xiàng),詳細(xì)資料請(qǐng)參閱php.net。open_file()
這不是一個(gè)PHP函式,會(huì)引致執(zhí)行錯(cuò)誤。
15.mysql_fetch_row()和mysql_fetch_array()有什么分別?
mysql_fetch_row()把數(shù)據(jù)庫(kù)的一列儲(chǔ)存在一個(gè)以零為基數(shù)的陣列中,第一欄在陣列的索引0,第二欄在索引1,如此類(lèi)推。mysql_fetch_assoc()把數(shù)據(jù)庫(kù)的一列儲(chǔ)存在一個(gè)關(guān)聯(lián)陣列中,陣列的索引就是欄位名稱(chēng),例如我的數(shù)據(jù)庫(kù)查詢(xún)送回“first_name”、“l(fā)ast_name”、“email”三個(gè)欄位,陣列的索引便是“first_name”、“l(fā)ast_name”和“email”。mysql_fetch_array()可以同時(shí)送回mysql_fetch_row()和mysql_fetch_assoc()的值。16.下面的代碼用來(lái)做什么?請(qǐng)解釋。$date="08/26/201*";print
ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","[url=file://2///1///3%22,$date]\\\\2/\\\\1/\\\\3",$date[/url]);這是把一個(gè)日期從MM/DD/YYYY的格式轉(zhuǎn)為DD/MM/YYYY格式。我的一個(gè)好朋友告訴我可以把這個(gè)正規(guī)表達(dá)式拆解為以下的語(yǔ)句,對(duì)于如此簡(jiǎn)單的表示是來(lái)說(shuō)其實(shí)無(wú)須拆解,純粹為了解說(shuō)的方便:
//對(duì)應(yīng)一個(gè)或更多0-9,后面緊隨一個(gè)斜號(hào)$regExpression="([0-9]+)/";//應(yīng)一個(gè)或更多0-9,后面緊隨另一個(gè)斜號(hào)$regExpression.="([0-9]+)/";//再次對(duì)應(yīng)一個(gè)或更多0-9$regExpression.="([0-9]+)";至于[url=file://2///1///3]\\\\2/\\\\1/\\\\3[/url]則是用來(lái)對(duì)應(yīng)括號(hào),第一個(gè)括號(hào)對(duì)的是月份,第二個(gè)括號(hào)對(duì)應(yīng)的是日期,第三個(gè)括號(hào)對(duì)應(yīng)的是年份。
17.給你一行文字$string,你會(huì)如何編寫(xiě)一個(gè)正規(guī)表達(dá)式,把$string內(nèi)的HTML標(biāo)簽除去?首先,PHP有內(nèi)建函式strip_tags()除去HTML標(biāo)簽,為何要自行編寫(xiě)正規(guī)表達(dá)式?好了,便當(dāng)作是面試的一道考題吧,我會(huì)這樣回答:
$stringOfText="Thisisatest";$expression="/(.*?)/";echopreg_replace($expression,"[url=file://2/]\\\\2[/url]",$stringOfText);//有人說(shuō)也可以使用/(]*>)/$expression="/(]*>)/";echopreg_replace($expression,"",$stringOfText);18.PHP和Perl分辨陣列和散列表的方法有什么差異?這正是為何我老是告訴別人選擇適當(dāng)?shù)木幊陶Z(yǔ)言,若果你只用一種語(yǔ)言的話你怎么能回答這道問(wèn)題?這道問(wèn)題很簡(jiǎn)單,Perl所有陣列變量都是以@開(kāi)頭,例如@myArray,PHP則沿用$作為所有變量的開(kāi)頭,例如$myArray。
至于Perl表示散列表則用%,例如%myHash,PHP則沒(méi)有分別,仍是使用$,例如$myHash。
19.你如何利用PHP解決HTTP的無(wú)狀態(tài)本質(zhì)?
最主要的倆各選擇是session和cookie。使用session的方法是在每一頁(yè)的開(kāi)始加上session_start(),然后利用$_SESSION散列表來(lái)儲(chǔ)存session變量。至于cookie你只需記著一個(gè)原則:在輸出任何文字之前調(diào)用set_cookie()函式,此外只需使用$_COOKIE散列表便可以存取所有cookie變量。
還有一個(gè)不那么可靠的方法,就是利用訪客的IP地址,這個(gè)方法有特定的危險(xiǎn)性。20.GD函式庫(kù)用來(lái)做什么?
這個(gè)可能是我最喜歡的函式庫(kù),自從PHP4.3.0版本后GD便內(nèi)建在PHP系統(tǒng)中。這個(gè)函式庫(kù)讓你處理和顯示各式格式的圖檔,它的另一個(gè)常見(jiàn)用途是制作所圖檔。GD以外的另一個(gè)選擇是ImageMagick,但這個(gè)函式庫(kù)并不內(nèi)建于PHP之中,必須由系統(tǒng)管理員安裝在伺服器上。
21.試寫(xiě)出幾個(gè)輸出一段HTML代碼的方法。
嗯,你可以使用PHP中任何一種輸出語(yǔ)句,包括echo、print、printf,大部分人都使用如下例的echo:
echo"Mystring$variable";你也可以使用這種方法:
echo
友情提示:本文中關(guān)于《php程序員面試題(附答案)》給出的范例僅供您參考拓展思維使用,php程序員面試題(附答案):該篇文章建議您自主創(chuàng)作。
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。