自己從網上找了幾份常考到的PHP面試題進行了整理,然后才有了這份PHP面試題,並且我把所有的題目進行了詳細分析和代碼分析,希望可以對大家有幫助,謝謝大家。
這份試題我也上傳到了百度雲,有需要的可以直接去百度雲下載這份試題,希望可以幫到大家。
鏈接:http://pan.baidu.com/s/1i5oTN7n 密碼:ykws
PHP面試題
一、選擇題
1.下面哪項描述是錯誤的?( A )
A. 父類的構造函數與析構函數不會自動被調用
B. 成員變量需要用public,protected,private修飾,在定義變量時不再需要var關鍵字
C. 父類中定義的靜態成員,不可以在子類中直接調用
D. 包含抽象方法的類必須為抽象類,抽象類不能被實例化
答案:A。在PHP的面向過程中,子類可以修改和調整父類定義的類成員,我們稱它為重寫。一旦子類修改了,就按照子類修改之后的功能執行。所以如果子類中有構造函數與析構函數就會自動執行子類的,如果子類中沒有構造函數和析構函數就會自動執行父類中的構造函數和析構函數。
2.關於exit( )與die( )的說法正確的是(D)
A、當exit( )函數執行會停止執行下面的腳本,而die()無法做到
B、當die()函數執行會停止執行下面的腳本,而exit( )無法做到
C、die()函數等價於exit()函數
D、die()函數與exit()函數沒有直接關系
答案:D。exit() 函數輸出一條消息,並退出當前腳本。die() 函數輸出一條消息,並退出當前腳本。並且die()函數是 exit() 函數的別名,兩者執行的功能都一樣,但是二者沒有直接關系。
3.下面程序運行結果(B)
$nextWeek = time() + (7 * 24 * 60 * 60);
echo ‘Now: ‘. date(‘Y-m-d’) .”\\n”;
echo ‘Next Week: ‘. date(‘Y-m-d’, $nextWeek) .”\\n”;
?>
A、得到今天的日期(月-日)
B、得到今天的日期(年-月-日)與下周的日期(年-月-日)
C、得到現在的時間(小時-分-秒)
D、得到現在到下周的時間間隔
答案:time()輸出的是當前時間戳,時間戳加上的是一周的時間戳,所以可以得到下一周的時間。date() 函數格式化本地日期和時間,並返回已格式化的日期字符串。date()函數語法為:date(時間格式,時間戳);而時間格式中Y代表年,m代表月,d代表日,如果要具體到時間可以在Y-m-d后面加上H:i:s,分別意思是H代表時,i代表分,s代表秒,這樣就可以輸“出年-月-日 時:分:秒”了。而在剛才的date(‘Y-m-d’, $nextWeek)中,Y-m-d中的‘-’是可以替換成其他任意字符的,這樣就可以輸出其他格式,例如Y/m/d對應的是年/月/日的格式。
3.以下代碼執行結果為:(D)
function print_A(){
$A = “phpchina”;
echo “A值為: “.$A.”";
//return ($A);
}
$B = print_A();
echo “B值為: “.$B.”";
?>
A. A值為: phpchina B值為: phpchina
B. A值為: B值為: phpchina
C. A值為: B值為:
D. A值為: phpchina B值為:
答案:D。頁面加載時函數不會立即執行,函數只有在被調用時才會執行。當B=print_A()函數時,print_A()函數被調用,輸出”A值為: phpchina”,由於A函數是直接輸出值,而不是把print_A中的值返回賦值給B,所以導致print_A返回的值為空賦值給B,B的值為空。最后結果為先輸出A值為: phpchina,緊跟其后執行echo “B值為:”,而$B為空,沒有東西。所以就連在一起得到輸出結果為“A值為: phpchina B值為:”。
4.以下代碼執行結果為:(C)
$A=”Hello”;
function print_A()
{
$A = “php mysql !!”;
global $A;
echo $A;
}
echo $A;
print_A();
?>
A Hello
B php mysql !!
C Hello Hello
D Hello php mysql
答案:C。這里主要考察PHP的變量作用域的問題。在這題中,一個是函數外的$A稱為全局變量,而函數內的$A是局部變量。除非在函數中把$A申明為全局變量,否則兩者互不影響。現在在print_A函數中用global申明了變量 $A為全局變量 ,任何變量的所有引用變量都會指向到全局變量,所以global $A后的$A不是‘Hello php mysql’而是全局的‘Hello’。在函數外中echo $A;是執行輸出全局的$A,全局$A是不會被函數內的變量影響的,也就是不會被函數內的$A改變,所以輸出’hello’;而后執行print_A()函數時,函數內的$A已經被global改變為全局變量,所以輸出的時候也是‘Hello’,所以最終結果為’Hello Hello’。
5.修改MySQL用戶root的密碼的指令是?(A)
A. mysqladmin -u root password test
B. mysql -u root password test
C. mysql -u root -p test
D. mysql -u root -password test
答:答案為A。總共有三種方法可以通過命令對mysql用戶進行修改密碼。
方法一是:用SET PASSWORD命令;mysql -u root;mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');進行修改。
方法二:用mysqladmin,mysqladmin -u root password "newpass";如果root已經設置過密碼,采用如下方法:mysqladmin -u root password oldpass "newpass";
方法三:用UPDATE直接編輯user表,mysql -u root;mysql> use mysql;mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root'。
而題中使用的是方法二進行MySQL用戶root的密碼修改指令。
6.設有一個數據庫mydb中有一個表tb1,表中有六個字段,主鍵為ID,有十條記錄,ID從0到9,以下代碼輸出結果是?(B)
$link = mysql_connect(‘localhost’, ‘user’, ‘password’)
or die(‘Could not connect: ‘.mysql_error());
$result = mysql_query(“SELECT id, name, age FROM mydb.tb1 WHERE id<’5′“)
or die(‘Could not query: ‘.mysql_error());
echo mysql_num_fields($result);
mysql_close($link);
?>?
A. 6 B. 5 C. 4 D. 3
答案:B。$link執行的部分是連接數據庫,$mysql_query里面執行的是數據庫查詢。而表中有id為0-9十條數據,從SQL語句中的where后面的條件可以看出是從表中查詢id<5的所有數據。也就是id為0到4的數據,所以一共會得到5條數據。mysql_num_fields是返回結果集中字段的數,也就是5,最后輸出得到結果5。
7、下面的代碼的輸出是什么?(B)
$s = ’12345′;
$s[$s[1]] = ’2′;
Echo $s;
?>
A. 12345 B. 12245
C. 22345 D. 11345
E. Array
答案:B。$s是一個字符串,存在的位數對應的序號是從0開始的,和數組的順序一樣。所以$s的位數排序是0-4,$s[1]指向的是2而不是1,所以$s[1]=2,而$s[$[1]]相當於$s[2],而$s[2]指向的是3,這時候賦值2替換掉3,所以再輸出$s時,$s是被2替換3后的12245。
8. PHP中,單引號和雙引號所包圍的字符串有什么區別?(CD )(選擇兩項)
A. 單引號速度快,雙引號速度慢
B. 雙引號速度快,單引號速度慢
C. 兩者沒有速度差別
D. 雙引號解析其中以$開頭的變量,而單引號不解析
答案:CD。PHP中的單雙引號並沒有解析加載速度快慢的區別,並且單雙引號解析加載速度是一樣的,反而是雙引號解析其中以$開頭的變量,而單引號不解析,所以單引號包含$的變量時是會直接原樣輸出的。
二、問答題
- php中如何取得get,post參數,和上傳的文件數據?
答:在HTML表單中form表單的Method方法提交中可以設置為post或get兩種方式提交數據,后台PHP對應獲取數據的函數為$_POST[]和$_GET[]兩個函數,而$_REQUEST]函數也可以獲取form表單提交過來的數據,而且比$_POST和$_GET強大一些,它無論前台是通過post方式提交還是get方式提交都可以獲取到對應的數據。但一般為了考慮嚴謹性,前端提交方式為什么后台就需要用對應的請求方式,所以很少用$_REQUEST函數。除非不知道前端是用post還是get方式提交過來才用$_REQUEST函數接收數據。
關於$_POST和$_GET具有以下區別:
1.傳參方式不一樣。get是把參數數據加到提交表單中action屬性中的url中的,值和表單中各個name字段一一對應,從url中可以看到每個字段和值。而在后台需要使用$_GET方式獲取或$_REQUEST方式獲取。而post是通過HTTPPOST機制,將表單內各個字段與其內容防止在HTML的head中一起傳送到action屬性所指的url地址,用戶看不到這個過程。后台需要使用$_POST或$_REQUEST方式獲取。
2.傳送數據大小不同。get傳送的數據量較小,post傳送的數據量較大,一般被默認不受限制,但在理論上,IIS4中最大量為80kb,IIS5中為1000k。所以get傳送大小容易受到限制。
3.傳送數據安全度不同。get安全性非常低,因為傳送的數據可以通過瀏覽器地址一覽無遺的看到,而post安全性較高,用戶看不到整個傳送過程。
針對以上解析進行示例代碼解釋如下:
<meta charset="utf-8"> <!-- 設置中文編碼為utf8,防止亂碼 --> <?php if(isset($_POST['sub'])){ //判斷用戶點擊提交按鈕后執行下去 $get = $_GET['c']; //獲取url中參數 $user = $_POST['user']; //獲取post傳過來的用戶名 echo 'GET方式:'.$get.";POST方法:".$user."<br>"; print_r($_REQUEST); //可以通過$_REQUEST獲取post和get傳來的全部數據 } ?> <!-- HTML表單數據 --> <form action="face.php?c=get" method="post"> 用戶名:<input type="text" name="user" > <input type="submit" value="提交" name="sub"> </form>
程序運行結果為:
獲取上傳文件的函數為$_FILES函數。$_FILES:經由 HTTP POST 文件上傳而提交至腳本的變量。而$_FILE函數獲得的是一個文件數組數據,其中分別包括以下數據:
$_FILES['myFile']['name'] 客戶端文件的原名稱
$_FILES['myFile']['type'] 文件的 MIME類型,需要瀏覽器提供該信息的支持,例如"image/gif"
$_FILES['myFile']['size'] 已上傳文件的大小,單位為字節
$_FILES['myFile']['tmp_name'] 文件被上傳后在服務端儲存的臨時文件名,一般是系統默認,可以在php.ini的upload_tmp_dir指定,但用 putenv() 函數設置是不起作用的
$_FILES['myFile']['error'] 和該文件上傳相關的錯誤代碼,['error'] 是在 PHP 4.2.0版本中增加的,下面是它的說明:(它們在PHP3.0以后成了常量)
UPLOAD_ERR_OK 值:0; 沒有錯誤發生,文件上傳成功
UPLOAD_ERR_INI_SIZE 值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize選項限制的值
UPLOAD_ERR_FORM_SIZE 值:2;上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值
UPLOAD_ERR_PARTIAL 值:3; 文件只有部分被上傳
UPLOAD_ERR_NO_FILE 值:4;沒有文件被上傳, 值:5; 上傳文件大小為0。
注意:在Html中提交文件到PHP后台接收時,需要使用post提交方式,並且需要在form表單頭加入:enctype="multipart/form-data"。
通過以上解析,進行代碼實例解釋為:
<meta charset="utf-8"> <!-- 設置中文編碼為utf8,防止亂碼 --> <?php if(isset($_POST)){ //如果存在post提交就執行 echo "<pre>"; //設置打印格式 print_r($_FILES); // 打印文件數據 echo "</pre>"; } ?> <!-- 設置文件傳輸,注意加enctype="multipart/form-data" --> <form action="files.php" method="post" enctype="multipart/form-data"> <input type="file" name="files" > <input type="submit" value="提交" name="sub"> </form>
程序運行結果為:
2. include和require的區別?
答:include和require都可以在php中引入文件,它們引用文件時都是函數后面跟文件名,如:require“files.php”;和include“files.php”。它們兩者用途是完全一樣的,但是它們最根本的區別在於錯誤處理的方式不一樣。
require 如果文件不存在,會生成致命錯誤(E_COMPILE_ERROR)並停止腳本
include 如果文件不存在,只生成警告(E_WARNING),並且腳本會繼續
因此,如果您希望繼續執行,並向用戶輸出結果,即使包含文件已丟失,那么請使用 include。否則,在框架、CMS 或者復雜的 PHP 應用程序編程中,請始終使用 require 向執行流引用關鍵文件。這有助於提高應用程序的安全性和完整性,在某個關鍵文件意外丟失的情況下。
關於require和include外,還有require_once()和include_once()兩個函數,用require_once()和include_once()可以檢測文件是否有重復包含,如果已經包含了則不會包含第二次,可以減少代碼的重復 。
除了以上它們錯誤處理方式的最大區別外,還具有以下區別:
1.include有返回值,而require沒有。如果include引入成功,將它賦值給$a,echo $a,會得到數字1。代表引入成功,而如果引入失敗會警告,沒有輸出,並且程序繼續執行下去。
2.require是無條件包含也就是如果一個流程里加入require,無論條件成立與否都會先執行require。 而 include一般是放在流程控制的處理部分中PHP程序網頁在讀到include的文件時,才將它讀進來。這種方式可以把程序執行時的流程簡單化。
根據以上解析,通過代碼解釋為:
faces.php文件內容為:
<?php echo "hello,world!"; ?>
在require.php中引入faces.php,然后運行require.php代碼:
<?php $a = include "facess.php"; $a = require "faces.php"; ?>
程序運行結果為:
可以發現include引入的facess.php並不存在報錯了,但是require ‘faces.php’;存在,而在錯誤后面輸出了”hello,world!”。說明include引入的文件不存在會報錯,並且依然會繼續執行后面的代碼。
3.echo、print_r、print、var_dump之間有什么區別?
答:echo 用於輸出數值變量或者是字符串。但使用echo來輸出引用變量時,如數組,僅輸出數組的名字,顯示為Arrary;
print_r(expression)的作用是輸出一個數組,實際上參數expression的類型可為數值變量和引用變量。
print() 函數輸出一個或多個字符串,功能和echo差不多,且有返回值。
var_dump(expression)函數的輸出結果<變量類型,變量值,變量長度>,參數expression表示各種變量類型,作用是輸出一個變量的詳細信息。
它們的區別在於面對不同的數據類型使用不同的函數輸出對應的內容。echo函數輸出一個或多個字符串,並且沒有返回值,而print()它有返回值,一般返回true,返回false的情況應該沒有。在寫法上,它和echo一樣,並且echo的速度比print()稍快,因為echo沒有返回值。而echo和print()主要針對字符串來使用,不能輸出對象。而print_r()和var_dump()函數主要針對輸出數組。print_r和var_dump都能輸出數組和對象,但print_r對布爾型的輸出不太明顯;var_dump輸出比較詳細,一般調試時用得多。
通過以上的解析,具體的代碼解釋為:
<meta charset="utf8"> <!-- 設置編碼為utf8 防止亂碼 --> <?php echo "echo 和 print 的比較"."<br>"; $s = "abcdefg"; $c = "ddddd"; $arr = array("hello","world","!"); echo "我是echo出來的:".$s."--數組輸出為:".$arr."<br>"; //會發現提示,$arr輸出為Array print "我是print出來的:".$s.'---打印輸出:'.$arr[0]."<br>"; echo "<h3>------分割線-------</h3><br>"; echo "print_r 和 var_dump 的比較"."<br>"; print_r($arr); echo "<br>"; var_dump($arr); ?>
程序運行結果為:
從結果可以看出使用echo來輸出引用變量時,如數組,會只輸出數組的名字,顯示為Arrary,並且有Notice的提示。而echo和print都可以輸出字符。區別只在於是否有返回值。而print_r和var_dump都可以打印數組,只是var_dump返回的數據更加詳細,包括字符串的長度和字符類型,調試時用的比較多。
4.談談mvc的認識
答:MVC是一種設計模式,它可以降低對象之間的耦合度,分離出了業務對象層(Model模型),用戶界面顯示層(View視圖)和業務邏輯處理層(Controller控制器),所以簡稱為mvc模式。在實際開發過程中,controller以及view都依賴於model,因為view和controller都得向model發送數據請求。數據通過controller輸入到系統當中,並最終通過view顯示出結果。具體意思為controller處理每一個外部的http請求,而view將產生http回應。
它們三者的關系為:
該圖的具體解釋為:模型Model – 管理大部分的業務邏輯和所有的數據庫邏輯。模型提供了連接和操作數據庫的抽象層。控制器Controller - 負責響應用戶請求、准備數據,以及決定如何展示數據。視圖View – 負責渲染數據,通過HTML方式呈現給用戶。
目前的PHP框架thinkphp,codeIgniter,Yii,laravel框架都是使用MVC模式進行架構設計的。
5.常用的超全局變量(8個)
答:在PHP中常用的超全局變量主要有以下8個。
(1)$_GET ----->get傳送方式
主要用於接受表單get方式傳輸過來的數據。
(2)$_POST ----->post傳送方式
主要用於接受表單post方式傳輸過來的數據。
(3)$_REQUEST ----->可以接收到get和post兩種方式的值
主要用於表單post或get方式傳輸過來的數據。
通過以上幾個函數的解析,用代碼進行解釋:
<meta charset="utf8"> <!-- 設置utf8編碼,防止編碼亂 --> <?php if(isset($_POST)){ @$get = $_GET['c']; @$test = $_POST['test']; echo "get:".$get.",post:".$test."<br>"; echo "<pre>"; print_r($_REQUEST); //輸出post和get傳輸方式數據 echo "</pre>"; } ?> <form action="server.php?c=get" method="post" enctype="multipart/data-form"> 測試:<input type="text" name="test" id=""><br> <input type="submit" value="提交"> </form>
運行結果為:
(4)$GLOBALS ----->所有的變量都放在里面
$GLOBALS引用全局作用域中可用的全部變量,一個包含了全部變量的全局組合數組。變量的名字就是數組的鍵。
通過以上解析,可以通過代碼解釋為:
<?php $a = 1; $b = 2; function A(){ $sum = $GLOBALS['a'] + $GLOBALS['b']; echo $sum; } A(); ?>
程序運行結果為: 3
通過$GLOBALS['a'] + $GLOBALS['b'],可以獲取函數外的全局變量a,b,從而得到sum = 1 + 2;最后輸出得3 的結果。
(5)$_FILES ----->上傳文件使用
當客戶端上傳文件點擊提交后,PHP可以獲得一個$_FILES 數組,然后通過$_FILES函數可以獲取全部對應的文件數據。
通過以上解析,代碼解釋為
<meta charset="utf8"> <!-- 設置utf8編碼,防止編碼亂 --> <?php if(isset($_POST)){ echo "文件信息:"."<br>"; echo "<pre>"; print_r($_FILES); echo "</pre>"; } ?> <form action="server.php?c=get" method="post" enctype="multipart/form-data"> 文件:<input type="file" name="files" id=""> <input type="submit" value="提交"> </form>
結果為:
(6)$_SERVER ----->系統環境變量
$_SERVER是一個服務器數組,可以通過這個函數對應的鍵獲取對應服務器數據內容。具體的數據內容可以通過print_r($_SERVER);獲取一個關於服務器內容的數組。
通過以上解析,可以通過代碼解釋為:
<?php echo "<pre>"; print_r($_SERVER); echo "</pre>"; ?>
運行結果為:
(7)$_SESSION ----->會話控制的時候會用到
在使用$_SESSION時,需要用session_start();開啟session。開啟session會話控制后,可以通過$_SESSION[]對應的鍵存對應的變量信息,然后通過$_SESSION鍵輸出對應的內容。
通過以上解析,可以通過代碼解釋為:
<?php session_start(); //開啟會話控制 $_SESSION['user'] = 'hello'; //記住用戶名為hello echo $_SESSION['user']; //輸出用戶名 ?>
代碼運行結果為: hello
通過開啟會話控制后,只要用session記住對應的內容,就可以對應的輸出記住的信息。
(8)$_COOKIE ----->會話控制的時候會用到
在使用$_COOKIE時,需要先用setCookie("user", "111", time()+3600);記住對應內容,再用$_COOKIE進行輸出cookie記住的內容。
個別情況還需要瀏覽器本身開啟cookie才能使用cookie功能。
通過以上解析,代碼解釋為:
<?php setCookie("hello","111", time()+3600*24); echo $_COOKIE['hello']; ?>
程序運行結果:111
在使用$_COOKIE時,需要先用setCookie記住對應的鍵,才能通過$_COOKIE獲取記住的值。
6.用PHP打印出前一天的時間格式是2006-5-10 22:21:21
答:關於PHP的時間主要使用到的函數是strtotime(),可以把時間格式轉換成時間戳,再對時間戳進行加減,從而可以計算出給出的某個時間點對應的任意其他相隔時間點。具體的實現方法如下:
①時間格式轉換為時間戳,$time = strtotime(“2006-5-10 22:21:21”);
②時間戳加減計算任意其他時間點,題目計算的是該天的前一天,所以只要減去一天的時間就是這個時間點的前一天了,即$prev = $time - 24*60*60; 24*60*60代表的是一天的時間戳。
③打印前一天的時間,即 echo date(“Y-m-d H:i:s”,$prev); 即可獲得前一天的時間。具體的如果date(‘Y-m-d H:i:s’);輸出的是當前時間,而如果時間格式后有時間戳,則轉換成那個時間點的時間。
通過以上解析,可以得到代碼解釋為:
<?php date_default_timezone_set("PRC");//記住一定要用date_default_timezone_set()函數指定時間區,否則會報錯。PRC指代中國共和國時區 $time = strtotime("2006-5-10 22:21:21"); $prev = $time - 24*60*60; echo date("Y-m-d H:i:s",$prev); ?>
程序運行結果為:2006-05-09 22:21:21
通過以上代碼具體解析,可以看出只要涉及時間,都可以用時間戳進行時間的加減進行換算到對應的時間。
三、算法題
一群猴子排成一圈,按1,2,…,n依次編號。然后從第1只開始數,數到第m只,把它踢出圈,從它后面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個大王的編號。
答:因為有1到n只猴子,所以需要用到數組創建存儲n只猴子,然后因為每次數到m就踢出這只猴子,又從下一只開始數,所以需要用到循環。在循環中,可以設置一個$i=0,代表開始的第幾只猴子,對應數組中的鍵值。只要數組中有兩只以上的猴子就都需要繼續循環,而當猴子小於等於一只猴子時就說明是踢出其他猴子后最后剩下的唯一一只猴子,它就是大王。在內部循環中,判斷是不是被踢出的那只猴子,可以通過每次數的(i+1)序列整除m等於0代表第m只猴子被數到,然后將這只猴子從數組中踢出。如果在數的過程中沒有猴子被踢出,則說明這只猴子是安全的,需要放到最后面的位置讓它在下一輪中可以接着數下去。然后猴子對應的序列在末尾是接着之前最后面的n序號進行累加1下去的,所以每個數字都有可能在i+1的過程中最后被踢出,而具體的數字取決於m,i+1猴子是否被m整除就知道是否被數到。循環完后剩下的唯一一只猴子就代表是最后的大王,返回結果就可以了。
根據題目分析的算法思想,可以得到下面的代碼編寫,
<?php function king($n, $m){ // 創建n只猴子存儲對應序列的猴子數組 $monkeys = range(1, $n); // 設置從第一只猴子開始,對應猴子數組的序列為0 $i=0; while (count($monkeys)>1) { //只要猴子的數量大於2個就都需要繼續循環數下去 if(($i+1)%$m==0) { unset($monkeys[$i]); //當對應的數組序號猴子被數到被m整除就被踢出數組 } else { array_push($monkeys,$monkeys[$i]); //如果是安全的就把對應的猴子放到最后,等待下一次被數到 unset($monkeys[$i]); //刪除第一個被移動到最后面位置的猴子, } $i++; //依次循環,直到猴子只有一個才停止 } return current($monkeys); //返回數組當前第一個元素,就是數組剩下的最后一個猴子 } $a = king(10, 5);//輸入猴子數量和數到幾淘汰 print_r($a);// 打印猴子數量 ?>
程序運行結果為: 3
這是一份我自己整理的PHP面試過程中常考到的PHP面試題,希望可以幫到大家,有什么不懂可以在下面評論,都會積極回答的,謝謝大家。
面試題word文檔下載鏈接:http://pan.baidu.com/s/1i5oTN7n 密碼:ykws
琉憶個人博客網站:shuaiqi100.com
個人公眾號: