首頁 > 後端開發 > php教程 > 【吐血整理】40+個PHP面試題附答案(實戰經驗)

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

青灯夜游
發布: 2023-04-11 06:46:02
轉載
9878 人瀏覽過

這篇文章為大家總結了40 個PHP面試題大全及答案。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

【吐血整理】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 !=&#39;.&#39; && $fl != &#39;..&#39; 排除当前目录及父级目录
            if(is_dir($temp) && $fl!=&#39;.&#39; && $fl != &#39;..&#39;){
                echo &#39;目录:&#39;.$temp.&#39;<br>&#39;;
                read_all($temp);
            }else{
                if($fl !=&#39;.&#39; && $fl != &#39;..&#39;){
                    echo &#39;文件:&#39;.$temp.&#39;<br>&#39;;
                }
            }
        }
    }
}
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(&#39;a:b:&#39;);
 print_r($param_arr);
登入後複製

C、提示用户输入

fwrite(STDOUT,&#39;Please enter your name:&#39;);
 echo &#39;Your name is:&#39;.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也不要氣餒。

推薦學習:《PHP影片教學

以上是【吐血整理】40+個PHP面試題附答案(實戰經驗)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板