【吐血整理】40+個PHP面試題附答案(實戰經驗)

2022-07-01 14:06:39
本篇文章給大家總結了40+個PHP面試題大全及答案。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

1、什麼事物件導向?主要特徵是什麼?

物件導向是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特徵:封裝、繼承、多型。

2、SESSION 與 COOKIE的區別是什麼,請從協定,產生的原因與作用說明?

A、http無狀態協定,不能區分使用者是否是從同一個網站上來的,同一個使用者請求不同的頁面不能看做是同一個使用者。

B、SESSION儲存在伺服器端,COOKIE儲存在使用者端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴於cookie進行傳遞。

禁用cookie後,session不能正常使用。Session的缺點:儲存在伺服器端,每次讀取都從伺服器進行讀取,對伺服器有資源消耗。Session儲存在伺服器端的檔案或資料庫中,預設儲存在檔案中,檔案路徑由php組態檔的session.save_path指定。Session檔案是公有的。

3、HTTP 狀態中302、403、 500程式碼含義?

一二三四五原則:(即一:訊息系列;二:成功系列; 三:重定向系列;四:請求錯誤系列;五:伺服器端錯誤系列。)

  • 302:臨時轉移成功,請求的內容已轉移到新位置

  • 403:禁止存取

  • 500:伺服器內部錯誤

  • 401:代表未授權。

4、請寫出資料型別(int char varchar datetime text)的意思;請問 varchar 和 char有什麼區別?

Int 整數char 定長字元 Varchar 變長字元 Datetime 日期時間型Text 文字型 Varchar與char的區別 char是固定長度的字元型別,分配多少空間,就佔用多長空間。Varchar是可變長度的字元型別,內容有多大就佔用多大的空間,能有效節省空間。由於varchar型別是可變的,所以在資料長度改變的時,伺服器要進行額外的操作,所以效率比char型別低。

5、MyISAM和 InnoDB 的基本區別?索引結構如何實現?

A、MyISAM型別不支援事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,適合用於頻繁查詢的應用;

B、InnoDB型別支援事務,行鎖,有崩潰恢復能力,讀寫速度比MyISAM慢,適合於插入和更新操作比較多的應用,空間佔用大,不支援全文索引等。
建立索引:alert table tablename add index 索引名 (`欄位名`)

6、isset() 和 empty() 區別

sset判斷變數是否存在,可以傳入多個變數,若其中一個變數不存在則返回假;empty判斷變數是否為空為假,只可傳一個變數,如果為空為假則返回真。

https://jq.qq.com/?_wv=1027&k=55dPDrC

7、請說明 PHP 中傳值與傳參照的區別。什麼時候傳值什麼時候傳參照?

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

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

優缺點:按值傳遞時,php必須複製值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。按參照傳遞則不需要複製值,對於效能提高很有好處。

8、在PHP中error_reporting這個函數有什麼作用?

設定PHP的報錯級別並返回當前級別。

9、說說你對快取技術的瞭解?

快取技術是將動態內容快取到檔案中,在一定時間記憶體取動態頁面直接呼叫快取檔案,而不必重新存取資料庫。

10、現在程式設計中經常採取MVC三層結構,請問MVC分別指哪三層,有什麼優點?

MVC三層分別指:業務模型、檢視、控制器,由控制器層呼叫模型處理資料,然後將資料對映到檢視層進行顯示,優點是:①可以實現程式碼的重用性,避免產生程式碼冗餘;②M和V的實現程式碼分離,從而使同一個程式可以使用不同的表現形式

11、AJAX的優勢是什麼?

ajax是非同步傳輸技術,可以通過javascript實現,也可以通過JQuery框架實現,實現區域性重新整理,減輕了伺服器的壓力,也提高了使用者體驗。

12、在程式的開發中,如何提高程式的執行效率?

A、優化SQL語句,查詢語句中儘量不使用select *,用哪個欄位查哪個欄位;少用子查詢可用表連線代替;少用模糊查詢;

B、資料表中建立索引;

C、對程式中經常用到的資料生成快取。

13、對於大流量的網站,您採用什麼樣的方法來解決存取量問題?

A、有效使用快取,增加快取命中率

B、使用負載均衡

C、對靜態檔案使用cdn進行儲存和加速

D、想法減少資料庫的使用

E、檢視出現統計的瓶頸在哪裡

F、反向代理

14、語句include和require的區別是什麼?為避免多次包含同一檔案,可用什麼語句代替它們?

區別:

在失敗的時候:

  • include產生一個warning,而require產生直接產生錯誤中斷

  • require在執行前載入

  • include在執行時載入

代替:

  • require_once

  • include_once

15、foo()和@foo()之間有什麼區別?

@代表所有warning忽略

16、簡述php的垃圾收集機制。

答案:php中的變數儲存在變數容器zval中,zval中除了儲存變數型別和值外,還有is_ref和refcount欄位。refcount表示指向變數的元素個數,is_ref表示變數是否有別名。如果refcount為0時,就回收該變數容器。如果一個zval的refcount減1之後大於0,它就會進入垃圾緩衝區。當緩衝區達到最大值後,回收演演算法會迴圈遍歷zval,判斷其是否為垃圾,並進行釋放處理。

17、如何實現PHP的安全最大化?怎樣避免SQL隱碼攻擊漏洞和XSS跨站指令碼攻擊漏洞?

答:基本原則:不對外界展示伺服器或程式設計細節(遮蔽錯誤),不相信任何使用者提交的資料(過濾使用者提交)。

18、echo、print_r、print、var_dump區別

  • echo:語句結構;

  • print:是函數,有返回值

  • print_r:能列印陣列,物件

  • var_dump:能列印物件陣列,並且帶資料型別

19、寫出smarty模板的特點

速度快,編譯型,快取技術,外掛機制,強大的表現邏輯

20、PHP如何實現頁面跳轉

方法一:php函數跳轉,缺點,header頭之前不能有輸出,跳轉後的程式繼續執行,可用exit中斷執行後面的程式。

header("Location:網址");//直接跳轉
header("refresh:3;url=http://www.jsdaima.com");//三秒後跳轉

方法二:利用meta

echo"";

21、如何把一個GB2312格式的字串裝換成UTF-8格式?

iconv('GB2312','UTF-8','js程式碼(http://www.jsdaima.com)是IT資源下載與IT技能學習平臺。');

22、如果需要原樣輸出使用者輸入的內容,在資料入庫前,要用哪個函數處理?

htmlspecialchars或者htmlentities

23、什麼是 CSRF 攻擊 ?XSS 攻擊?如何防範?

CSRF,跨站請求偽造,攻擊方偽裝使用者身份傳送請求從而竊取資訊或者破壞系統。

講述基本原理:使用者存取A網站登陸並生成了cookie,再存取B網站,如果A網站存在CSRF漏洞,此時B網站給A網站的請求(此時相當於是使用者存取),A網站會認為是使用者發的請求,從而B網站就成功偽裝了你的身份,因此叫跨站指令碼攻擊。

CSRF防範:

A、合理規範api請求方式,GET,POST

B、對POST請求加token令牌驗證,生成一個隨機碼並存入session,表單中帶上這個隨機碼,提交的時候伺服器端進行驗證隨機碼是否相同。

XSS,跨站指令碼攻擊。

防範:不相信任何輸入,過濾輸入。

24、安全對一套程式來說至關重要,請說說在開發中應該注意哪些安全機制?

A、防遠端提交;
B、防SQL隱碼攻擊,對特殊程式碼進行過濾;
C、防止序號產生器灌水,使用驗證碼。

25、對json資料格式的理解?

JSON(javascript object Notation)是一種輕量級的資料交換格式,json資料格式固定,可以被多種語言用作資料的傳遞。

26、什麼是事務?及其特性?

答:事務:是一系列的資料庫操作,是資料庫應用的基本邏輯單位。

事務特性:

A、原子性:即不可分割性,事務要麼全部被執行,要麼就全部不被執行。
B、一致性或可串性。事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀態
C、隔離性。在事務正確提交之前,不允許把該事務對資料的任何改變提供給任何其他事務,
D、永續性。事務正確提交後,其結果將永久儲存在資料庫中,即使在事務提交後有了其他故障,事務的處理結果也會得到儲存。

或者這樣理解:

事務就是被繫結在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態,或者是上有個節點。為了確保要麼執行,要麼不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和永續性。

27、什麼是鎖?

答:資料庫是一個多使用者使用的共用資源。當多個使用者並行地存取資料時,在資料庫中就會產生多個事務同時存取同一資料的情況。若對並行操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。

加鎖是實現資料庫並行控制的一個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。

基本鎖型別:鎖包括行級鎖和表級鎖

28、索引的作用?和它的優點缺點是什麼?

答:索引就一種特殊的查詢表,資料庫的搜尋引擎可以利用它加速對資料的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的資料。索引可以是唯一的,建立索引允許指定單個列或者是多個列。缺點是它減慢了資料錄入的速度,同時也增加了資料庫的尺寸大小。

29、如何通俗地理解三個正規化?

第一規格化:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二正規化:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三正規化:3NF是對欄位冗餘性的約束,即任何欄位不能由其他欄位派生出來,它要求欄位沒有冗餘。

30、主鍵、外來鍵和索引的區別?

定義:
主鍵--唯一標識一條記錄,不能有重複的,不允許為空
外來鍵--表的外來鍵是另一表的主鍵, 外來鍵可以有重複的, 可以是空值
索引--該欄位沒有重複值,但可以有一個空值

作用:
主鍵--用來保證資料完整性
外來鍵--用來和其他表建立聯絡用的
索引--是提高查詢排序的速度

個數:
主鍵--主鍵只能有一個
外來鍵--一個表可以有多個外來鍵
索引--一個表可以有多個唯一索引

31、簡述 private、 protected、 public修飾符的存取許可權。

private : 私有成員, 在類的內部才可以存取。
protected : 保護成員,該類內部和繼承類中可以存取。
public : 公共成員,完全公開,沒有存取限制。

32、堆和棧的區別?

A、堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小;
B、棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義。

33、常用的魔術方法有哪些?舉例說明

答:php規定以兩個下劃線(__)開頭的方法都保留為魔術方法,所以建議大家函數名最好不用__開頭,除非是為了過載已有的魔術方法。

__construct() 範例化類時自動呼叫。
__destruct() 類物件使用結束時自動呼叫。
__set() 在給未定義的屬性賦值的時候呼叫。
__get() 呼叫未定義的屬性時候呼叫。
__isset() 使用isset()或empty()函數時候會呼叫。
__unset() 使用unset()時候會呼叫。
__sleep() 使用serialize序列化時候呼叫。
__wakeup() 使用unserialize反序列化的時候呼叫。
__call() 呼叫一個不存在的方法的時候呼叫。
__callStatic()呼叫一個不存在的靜態方法是呼叫。
__toString() 把物件轉換成字串的時候會呼叫。比如 echo。
__invoke() 當嘗試把物件當方法呼叫時呼叫。
__set_state() 當使用var_export()函數時候呼叫。接受一個陣列引數。
__clone() 當使用clone複製一個物件時候呼叫。

34、$this和self、parent這三個關鍵詞分別代表什麼?在哪些場合下使用?

$this 當前物件
self 當前類
parent 當前類的父類別

$this在當前類中使用,使用->呼叫屬性和方法
self也在當前類中使用,不過需要使用::呼叫
parent在類中使用

35、作用域操作符::如何使用?都在哪些場合下使用?

呼叫類常數
呼叫靜態方法

36、__autoload()方法的工作原理是什麼?

答:使用這個魔術函數的基本條件是類檔案的檔名要和類的名字保持一致。

當程式執行到範例化某個類的時候,如果在範例化前沒有引入這個類檔案,那麼就自動執行__autoload()函數。

這個函數會根據範例化的類的名稱來查詢這個類檔案的路徑,當判斷這個類檔案路徑下確實存在這個類檔案後

就執行include或者require來載入該類,然後程式繼續執行,如果這個路徑下不存在該檔案時就提示錯誤。

使用自動載入的魔術函數可以不必要寫很多個include或者require函數。

37、簡述高並行網站解決方案。

A、前端優化(CND加速、建立獨立圖片伺服器)
B、伺服器端優化(頁面靜態化、並行處理[非同步|多執行緒]、佇列處理)
C、資料庫優化(資料庫快取[Memcachaed|Redis]、讀寫分離、分庫分表、分割區)
D、Web伺服器優化(負載均衡、反向代理)

38、PHP遍歷資料夾下所有檔案

<?php
function read_all($dir){
    if(!is_dir($dir)) return false;
    $handle = opendir($dir);
    if($handle){
        while(($fl = readdir($handle)) !== false){
            $temp = $dir.$fl;
            //$fl !='.' && $fl != '..' 排除當前目錄及父級目錄
            if(is_dir($temp) && $fl!='.' && $fl != '..'){
                echo '目錄:'.$temp.'<br>';
                read_all($temp);
            }else{
                if($fl !='.' && $fl != '..'){
                    echo '檔案:'.$temp.'<br>';
                }
            }
        }
    }
}
read_all("./dir/");
?>

39、在命令列中執行php程式

php indx.php

A、從命令列執行php非常簡單。但有些注意事項需要各位瞭解下,諸如$_SESSION之類的伺服器變數是無法在命令列中使用的,其他程式碼的執行則和web伺服器中完全一樣;
B、在命令列中執行php檔案的好處之一就是可以通過指令碼實現一些計劃任務(crontab)的執行,而無須通過web伺服器。

延伸1:
php -v 顯示當前PHP版本
php -m 顯示當前php載入的有效模組
php -i 輸出無html格式的phpinfo
php --rf function

延伸2:向php指令碼傳遞引數:
提示:命令列下執行php,是不走Apache/Nginx等這類東西的,沒有什麼http協定,所以get,post傳引數根本不起作用,並且還會報錯。有些時候需要在shell命令下把PHP當作指令碼執行,比如定時任務。這就涉及到在shell命令下如何給php傳參的問題,通常有三種方式傳參。

A、使用$argv or $argc引數接收

echo "接收到{$argc}個引數";
 print_r($argv);

B、使用getopt函數

$param_arr = getopt('a:b:');
 print_r($param_arr);

C、提示使用者輸入

fwrite(STDOUT,'Please enter your name:');
 echo 'Your name is:'.fgets(STDIN);

40、你用什麼方法檢查PHP指令碼的執行效率(通常是指令碼執行時間)和資料庫SQL的效率(通常是資料庫Query時間),並定位和分析指令碼執行和資料庫查詢的瓶頸所在?

A、PHP指令碼的執行效率

  • a、程式碼指令碼裡計時;

  • b、xdebug統計函數執行次數和具體時間進行分析,最好使用工具winCacheGrind分析;

  • c、線上系統用strace跟蹤相關程序的具體系統呼叫。

B、資料庫SQL的效率

  • a、sql的explain(mysql),啟用slow query log記錄慢查詢;

  • b、通常還要看資料庫設計是否合理,需求是否合理等。

41、對於大流量的網站,您採用什麼樣的方法來解決各頁面存取量統計問題。

A、確認伺服器是否能支撐當前存取量;
B、優化資料庫存取;
C、禁止外部存取連結(盜鏈), 比如圖片防盜鏈;
D、控制檔案下載,尤其是大檔案;
E、使用不同主機分流(負載均衡);
F、使用瀏覽統計軟體,瞭解存取量,有針對性的進行優化。

42、 MySQL資料庫作釋出系統的儲存,一天五萬條以上的增量,預計運維三年,怎麼優化?

A、設計良好的資料庫結構,允許部分資料冗餘,儘量避免join查詢,提高效率;
B、選擇合適的表欄位資料型別和儲存引擎,適當的新增索引;
C、mysql庫主從讀寫分離;
D、找規律分表,減少單表中的資料量提高查詢速度;
E、新增快取機制,比如memcached,redis等;
F、不經常改動的頁面,生成靜態頁面;
G、書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE。

43、Mysql的儲存引擎,myisam和innodb的區別。

A、MyISAM型別不支援事務處理等高階處理,而InnoDB型別支援;

B、MyISAM型別的表強調的是效能,其執行速度比InnoDB型別更快;

C、InnoDB不支援FULLTEXT型別的索引;

D、InnoDB中不儲存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可;

E、對於AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引;

F、DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除;

G、LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外來鍵)的表不適用;

H、MyISAM支援表鎖,InnoDB支援行鎖。

MyISAM:成熟、穩定、易於管理,快速讀取。一些功能不支援(事務等),表級鎖。
InnoDB:支援事務、外來鍵等特性、資料行鎖定。空間佔用大,不支援全文索引等。

其他,主要是一些面試後的個人看法和玄學了:

1.很多在職的同學覺得請假面試麻煩,其實現在很多公司都有安排晚上面試和週末面試專場的,提前溝通好就行了,請假的話一天面試三家應該不是問題。

2.投遞公司的順序建議,首先是一兩家公司預熱一下,然後比較心儀的很有把握的公司,然後才是非常心儀的公司,最後是選擇 性的面試。安排這個順序主要是,雖然可能你業務很厲害,但是進入面試狀態時需要一個過程的,面試預熱很有必要,這裡順便強調下面試提前準備,比如看下面試題,複習下技術書籍都很有必要的。提前選擇比較心儀的很有把握的公司,主要是為了拿到offer,一是做自我價值驗證,二是心中有底氣。

3.調整好心態,其實有些offer是帶有運氣成分的,畢竟對於有些體量公司來說,面試常有,編制不常有,所以拿不到offer也不要氣餒。

推薦學習:《》

以上就是【吐血整理】40+個PHP面試題附答案(實戰經驗)的詳細內容,更多請關注TW511.COM其它相關文章!