PHP面試題及答案
PHP面試題及答案分享,
PHP面試題及答案
。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;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由于函式 multiply() 沒(méi)有指定 $num 為全域變量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。
4. reference 跟一個(gè)正規(guī)的變量有什么分別?如何 pass by reference?在什么情況下我們需要這樣做?
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)為這是很嚴(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 - Advanced PHP Debugger 或稱 PHP - APD,第一步是執(zhí)行以下的指令安裝:
pear install apd安裝后在你的腳本的開(kāi)頭位置加入以下的語(yǔ)句開(kāi)始進(jìn)行偵錯(cuò):
apd_set_pprof_trace();執(zhí)行完畢,打開(kāi)以下檔案來(lái)查閱執(zhí)行日志:
apd.dumpdir
你也可以使用 pprofp 來(lái)格式化日志。
詳細(xì)的資料可以參閱 http://us.php.net/manual/en/ref.apd.php。
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)?ldquo;===”保證函式 strpos() 的送回值不會(huì)換算成布爾值.}
9.你會(huì)如何定義一個(gè)沒(méi)有成員函式或特性的類別 myclass?
class myclass{}
10.你如何產(chǎn)生一個(gè) myclass 的物件?
$obj = new myclass();
11.在一個(gè)類別內(nèi)如何存取這個(gè)類別的特性及變改它的值?
使用語(yǔ)句:$this->propertyName,例如:
class myclass{ private $propertyName; public function __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: http://www.search-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ò)誤,
資料共享平臺(tái)
《PHP面試題及答案》(http://www.msguai.com)。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,如此類推。mysql_fetch_assoc() 把數(shù)據(jù)庫(kù)的一列儲(chǔ)存在一個(gè)關(guān)聯(lián)陣列中,陣列的索引就是欄位名稱,例如我的數(shù)據(jù)庫(kù)查詢送回“first_name”、“last_name”、“email”三個(gè)欄位,陣列的索引便是“first_name”、“last_name”和“email”。mysql_fetch_array() 可以同時(shí)送回 mysql_fetch_row() 和 mysql_fetch_assoc() 的值。
16.下面的代碼用來(lái)做什么?請(qǐng)解釋。
$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","\\2/\\1/\\3",$date);
這是把一個(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]+)";至于 \\2/\\1/\\3 則是用來(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 = "<p>This is a test</p>";$expression = "/<(.*?)>(.*?)<\/(.*?)>/";echo preg_replace($expression, "\\2", $stringOfText);// 有人說(shuō)也可以使用 /(<[^>]*>)/ $expression = "/(<[^>]*>)/";echo preg_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ù),自從 PHP 4.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 "My string $variable";你也可以使用這種方法:
echo <<<ENDThis text is written to the screen as output and this $variable is parsed too. If you wanted you can have <span> HTML tags in here as well.</span> The END; remarks must be on a line of its own, and can't contain any extra white space.END;
22.PHP 比 Perl 好嗎?請(qǐng)討論。
我們不要為一個(gè)簡(jiǎn)單的問(wèn)題引發(fā)一場(chǎng)舌戰(zhàn),正如我經(jīng)常說(shuō)的:“為工作選擇適合的語(yǔ)言,不要把工作遷就語(yǔ)言。”我個(gè)人認(rèn)為 Perl 十分適合用作命令行工具,雖然它在網(wǎng)頁(yè)應(yīng)用上也有不錯(cuò)的表現(xiàn),但是它的真正實(shí)力在命令行上才能充分發(fā)揮。同樣地,PHP 雖然可以在控制臺(tái)的環(huán)境中使用,但是個(gè)人認(rèn)為它在網(wǎng)頁(yè)應(yīng)用上有更好的表現(xiàn),PHP 有大量專門為網(wǎng)頁(yè)應(yīng)用而設(shè)計(jì)的函式,Perl 則似乎以命令行為設(shè)計(jì)之本。
個(gè)人來(lái)說(shuō)兩種語(yǔ)言我都喜歡,在大學(xué)期間我經(jīng)常使用 Perl、PHP 和 Java,可惜工作上我使用 C#,但在家里我花不少時(shí)間操練 PHP、Perl、Ruby(現(xiàn)正學(xué)習(xí))和 Java,保持我的技能知識(shí)在最新?tīng)顟B(tài)。很多人問(wèn)我 C 和 C++ 怎么樣,它們是否仍有機(jī)會(huì)在我的應(yīng)用中占一席位,我的答案基本上是“否”,我近來(lái)的工作主要集中在網(wǎng)頁(yè)開(kāi)發(fā),雖然 C 和 C++ 也可以用來(lái)寫(xiě)網(wǎng)頁(yè),但它們到底不是為這種工作而設(shè)計(jì)的,“為工作選擇適合的語(yǔ)言”,若果我需要編寫(xiě)一個(gè)控制臺(tái)應(yīng)用,用來(lái)展示 bubble sort、quick sort 和 merge sort 的效能比較,我一定會(huì)使用 C / C++。若果我需要編寫(xiě)一個(gè)相片簿系統(tǒng),我會(huì)使用 PHP 或者 C#(我認(rèn)為制作用戶介面方面 .NET 語(yǔ)言比網(wǎng)頁(yè)更加)。
更多相關(guān)的面試問(wèn)題文章推薦,大家敬請(qǐng)繼續(xù)閱讀:微軟常見(jiàn)面試問(wèn)題 國(guó)企面試常見(jiàn)問(wèn)題及答案 外資銀行面試問(wèn)題集錦
【PHP面試題及答案】相關(guān)文章:
PHP面試題附答案08-17
比較基礎(chǔ)的php面試題及答案06-20
六道php面試題附答案06-18
幾道PHP的面試題06-08
Yahoo的PHP面試題10-08
PHP面試題大全05-20
PHP面試題集10-17
Yahoo-PHP面試題09-29
一些PHP的面試題10-30