php面試題收集與整理(一)

1.談談對MVC的認識?

MVC是一種設計模式,他強制性的使應用程序的輸入/處理/輸出分開,應用程序被分化成三個核心部件:模型、視圖、控制器。

視圖是用戶看到並與之交互的辦面。

模型表示業務模型與企業規則

控制器接入用戶輸入並調用模型與視圖去完成用戶的需求。

MVC優點:低耦合性、高重用性和可適用性、較低的生命週期成本、快速部署、有利於軟件工程化管理

MVC缺點:沒有明確的定義,完全理解MVC並不容易.不適合小型規模的應用程序.

2.php如何拋出和接收錯誤?

try{....}catch(){.....}如果沒有觸發異常,繼續執行.如果異常被觸發就會拋出一個異常.catch代碼捕獲悍異常,並創建一個包含異常性的對象.$e->getMessage();

實例1.

<?php
try {
    $error = 'Always throw this error';
    throw new Exception($error);

    // 從這裏開始,tra 代碼塊內的代碼將不會被執行
    echo 'Never executed';

} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// 繼續執行
echo 'Hello World';
?> 

3.請取出數組中最大值?

$a=array(1,9,8,7,8,7,9,7,10);

echo $max($a);

rsort($a);

echo array_shift($a);

4.請說明PHP中傳值和引用的區別.什麼時候用傳值什麼時候引用?

按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略.

按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改.

優缺點:按值傳遞時.php必須複製值.特別是對於大型的字符串和對象說,將是一個很大的代價.按引用傳遞則不需要複製值.對於性能提高很有好處.

如果不想改變變量的值的時候就傳值.如果要讓函數改變原變量就可以用引用傳值.

5.有一個一維數組,裏面存儲整形數據,請寫一函數,將他們按從大到小的順序排序,要求執行效率高.並說明如何改善執行效率,不能使用PHP函數.

<?php
function getSort($array)
{
    for($i=0;$i<count($array);$i++)
    {
           for($j=$i+1;$j<count($array);$j++)
           {
                  if($array[$i]<$array[$j])
                  {
                            $tmp=$array[$i];
                             $array[$i]=$array[$j];
                              $array[$j]=$tmp
                   }
           }
     }
}

6.請問同時滿足這樣條件的數:被10除餘9,被9除餘8,被8除餘7?(100-1000間有多個這樣的數)

分析:被10除餘9,那麼+1則被10整除,同理+1分別能被9和8整除.假高這個數爲X,則這個100<=X<=100

則101<=X+1<=1000+1     => x+1爲 8 ,9,10的倍數=>8=2*2*2,9=3*3,10=2*5

則X+1一定是2*2*2*3*3*5的倍數(只能約掉一個2)  =>第一個數爲360,第二個數720

=> 359,719

7.請寫出一個簡單的靜態數組?

class A

{

       static $a = array('xxx'=>xxxx);

}

print_r(A::$a);

8.寫一個簡單的jqeruy顯示隱藏代碼?

$("#xxx").show();

$("#xxx").hide();

9.include與require的區別是什麼?

php在遇到include時就必須重新解析一次,如果在同一個頁面出現10次include,它就會解析10次,而require不管在同一個頁面出現多少次,只會解析一次.require執行效率比include高.

require包含進來 的內容被當成當前文件的一個組成部分,所以當包含進來的文件有語法錯誤或者文件不存在的時候,那個PHP腳本都不在執行.include函數相當於指定這個文件夾的路徑,當包含的文件有錯時不會影響本身程序執行.include可以進行判斷是否包含進來,而require不管在任何時候都被包含進來了.

10.php獲取當前時間並打印?

echo date('Y-m-d H:i:s');

11.字符串轉數組,數組轉字符串,字符串截取,字符串替換,字符串查找的函數分別是?

implode() expload() substr() str_replace() strpos,strrpos,strstr

12.解釋下PHP類中:protected,public,prtvate,interface,abstract ,final,static的含義?

protected受保護的,在本類和子類中有效.

public 公共的,在本類,子類中,類外都可以用

private私有的,只在本類中有用

interface定義一個接口時使用的關鍵字

abstract定義一個抽象類或者抽象方法時使用的關鍵字.

final用final申明的方法無法被覆蓋,用final申明的類不能被繼承

static定義一個靜態方法或者靜態屬性使用的關鍵字

13.從表login中選出name字段包含的前10條結果所有信息的sql語句

select * from login where name like '%admin%' limit 0,10;

14.解釋左連接,右連接,內連接,全連接

內連接只會選出兩張表中互相匹配的記錄,因此,這會導致有時我們需要的記錄沒有包含進來.內連接是兩個表中都必須有連接字段的對應值的記錄,數據才能檢索出來..

左連接和右連接者是外部鏈接,也就是區別於內部連接,它對不滿足連接條件的行並不是像內部連接一樣將數據完全過濾掉,而是保留一部分數據,行數不會減少;左連接只要左邊表中有記錄,數據就能被檢索出來,而右邊有的記錄必要在左邊表中有的記能才能被檢索出來.

右連接就是隻要右邊表中有記錄,數據就能檢索出來.

全連接剛會回返兩個表中的所有記錄

15.簡述論壇中無限分類的實現原理

數據庫分類表的設計:id字段,父id字段,類名稱字段,path字段

path字段存當前分類的路徑, 格式:0,父類id,本身ID

查詢分類select * from 分類表 order by path asc;(查出每個分類及其他對應的子類)

16.寫一個函數,儘可能高效,從一個標準URL裏取出文件的擴展名.如:http://www.baidu.com/sex/sm.php?id=1需要取php或.php

$a = "url地址";

$b=parse_url($a);

echo substr($b['path'],strpos($b['path'],'.')); 或 echo end(expload('.',$b['path']));

17.描述下大流量高併發量網站的解決方案

確認服務器硬件是否足夠支持當前的流量

使用memcache緩存技術,將動態數據緩存到內存中,動態網直接調用這些文件不必再訪問數據庫

禁用外部盜鏈,外部網站的圖片或者文件盜鏈往往會帶來大量的負載壓力,因此應該嚴格限制外部對自身圖片或者文件盜鏈.目前可以簡單的通refer來控制盜鏈.apache自己就可以通過配置來禁止盜鏈.

控制大文件的下載,大文件下載會佔很大的流量.對於非SCSI硬盤來說會消耗,使得網站響應能力下降.

使用不迥的主機分流主要流量,使用流量統計軟件可以知道哪些地方不費大量流量,哪些頁面需要再進行優化

分庫分表

sphinx全文索引引擎

18.如何設計和配置Mysql,才能達到高效使用的目的.

數據庫設計方面,設計結構良好的數據庫,允許部分數據冗餘

選取最適用的字段屬性,儘可以把字段設置爲NOTNULL,這樣查詢的時候,數據庫不用去比較空值.

系統架構設計方面,表散列,把海量數據散列到幾個不同的表裏面,集羣,數據庫查詢和寫入分開

寫高效sql語句,以提高效率

使用JOIN代替子查詢

使用UNION來代替手動創建的臨時表

只從數據取必須的數據

必要的時候用不同存儲引擎,INNODB可以減少死鎖,heap可以提高一個數量級的查詢速度

使用事務/外鍵/索引

19.如何進行防SQL注入?

過濾一些常見的數據庫操作關鍵字, select ,insert,update,delete,and,*等或通過系統函數addslashes對內容進行過濾

php配置文件中register_globals=off;設置爲關閉狀態.(作用將註冊全局變量關閉);如接收POST表單的值使用$_POST['user'],假設設置爲ON的話$user才接收值

sql語句書寫的時候儘量不要省略小引號(tab上面那個)和單引號

提高數據庫命名技巧,對於一些重要的字段根據程序的特點命名,使之不易被猜中

對於常的方法加以封裝,避免直接暴漏SQL語句

開啓PHP安全模式safe_mode=on

打開magic_quotes_gpc來防止SQL注入,默認爲關閉,開啓後自動把用戶提交sql查詢語句進行轉換把"'"轉換成"\'"

控制錯誤信息輸出,關閉錯誤信息提示,將錯誤信息寫到系統日誌

使用MYSQLI或PDO預處理

20.用PHP寫出一個安全的用戶登錄系統需要注意哪些方面.

密碼要使用MD5(密碼+字符串)進行加密

登錄表單的名稱不要跟數據庫字段一樣,以免暴露表字段.

用戶表的表名,字段名,密碼儘量用不容易被猜到的.

要使用驗證碼驗證登陸,以防止暴力破解

驗證提交的數據是不是來本網站.

登陸後臺處理代碼數據庫部分可以使用預處理,做好過濾,防止sql注入

21.輸出爲Moailla/4.0(compatible;MSIE5.01;Window NT5.0)時,可能的輸出語句是:

$_SERVER['HTTP_USER_AGENT']

22.php一些正確的說法:

PHP有四種標量類型,布爾型(boolean),整型(integer),浮點型(float),字符串(string)

浮點型和雙精度型是同一種類型

僞類型:混合型(mixed),數字型(number),回調(callback)

23.echo function_exists('print');

輸出爲空,echo和print不是系統函數

24.

<?php
$bool = TRUE;
echo gettype($bool);
echo is_string($bool);

輸出boolean

25.

<?php
$a=12;
$b=012;
$c=0x12;
echo $a,"\n",$b,"\n",$c;
輸入結果爲 12 10 18

26.echo 1+2+"3+4+5"

輸出6

26.return chr(65)=='A'

輸出TRUE

26

<?php
	$a =array(1=>5,5=>8,22,2=>'8',81);
	echo $a[7];
	echo $a[6];
	echo $a[3];
 ?>
輸出8122加提示信息

27

<?php
  $a[bar]='hello';
  echo $a[bar];
  echo $a['bar'];
?>

輸出hellohello

28.php二進制位移

<<相當於乘2,>>相當於除2

29.

<?php
  function change(){
	 static $i = 0;
	 $i++;
	 return $i;
  }
  print change();  //1
  print change();  //2
?>

30.下面的include語句不正確的是?A
A. include "mms://www.abc.com/a.php";
B. include"http://www.abc.com/a.php";
C. include"https://www.abc.com/a.php";
D. include"ftp://www.abc.com/home/a.php";

31.

<?php
$foo = 'test';
$bar = <<<'EOT'
$foobar
EOT;
echo $bar;
?>

輸出$foobar

32.

$a=3;$b=4;
if($a||$b=5){    ||或和|的區別
	echo 'todo';
}

$b的值是:4

33.什麼是面向對象?主要特徵是什麼?

面向對象是程序的一種設計方式 ,它利於提高程序的重用性,使程序結構更加清晰

主要特徵:封裝,繼承,多態

34.session與cookie的區別是什麼,請從協議,產生的原因與作用上說明?

http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個用戶請求不同的頁面不能看作是同一個用戶

session保存在服務器端,cookie保存在客戶端,session依賴cookie進行保存.如果cookie被禁用了,session不能繼續使用.

35.http狀態中302,403,500代碼含義?

300重定向,403服務器拒絕訪問,500服務器內部錯誤

36.linux下建立壓縮包,解壓縮包的命令

壓縮:gzip tar -cvfz,zip,bzip2

解壓:gunzip,tar -zxvf,unzip,bunzip2



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章