首頁 >後端開發 >php教程 >PHP面試題大全(值得收藏)

PHP面試題大全(值得收藏)

藏色散人
藏色散人轉載
2019-12-04 16:19:098577瀏覽

相關推薦:《2019年PHP面試題大匯總(收藏)

一、PHP基礎部分

#1、PHP語言的一大優勢是跨平台,什麼是跨平台?

PHP的運行環境最優搭配為Apache MySQL PHP,此運行環境可以在不同作業系統(例如windows、Linux等)上配置,不受作業系統的限制,所以叫跨平台

2、WEB開發中資料提交方式有幾種?有什麼區別?百度使用哪一種方式?

Get與post兩種方式

區別:

(1)url可見性:get 方式url參數可見,post 不可見

(2 )可緩存性:get 方式是可以快取的,post 方式不可以快取。

(3)傳輸資料大小:get一般傳輸資料大小不超過2k-4k(依瀏覽器不同,限制不一樣,但相差不大);post 請求傳輸資料的大小依php.ini 配置文件設定,也可以無限大。

(4)資料傳輸上:get 方式透過url網址列拼接參數進行傳輸,post 方式透過body體傳輸。

建議:

1、get式安全性較Post式要差些包含機密資訊建議用Post資料提交式;

2、做資料查詢建議用Get式;做資料添加、修改或刪除建議用Post方式;

百度使用的get方式,因為可以從它的URL中看出

3、掌握PHP的哪些框架、模板引擎、系統等

框架:框架有很多,例如CI、Yii、Laravel等等,咱們學過的是thinkphp

模板引擎:也有很多,在課本中有,咱們學過的是smarty

系統:有很多,例如:康盛的產品(uchome、supesite、discuzX等),帝國系統、DEDE(織夢)、ecshop等,咱們學過的是DEDECMS、Ecshop

4、說一下你所掌握的網頁前端技術有哪些?

熟練DIV CSS網頁佈局,JavaScript,jQuery框架、photoshop圖片處理

#5、AJAX的優點是什麼?

ajax是非同步傳輸技術,可以透過javascript實現,也可以透過JQuery框架實現,實現局部刷新,減輕了伺服器的壓力,也提高了使用者體驗。

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

(1)使用驗證碼防止註冊機灌水。

(2)使用預處理,綁定參數,參數過濾轉義 防止sql注入

(3)使用token防止遠端提交,使用token驗證登入狀態。

7、在程式的開發中,如何提升程式的運作效率?

(1)最佳化SQL語句,查詢語句中盡量不使用select *,用哪個欄位查哪個欄位;少用子查詢可用資料表連線取代;少用模糊查詢。

(2)資料表中建立索引。

(3)對程式中常用到的資料產生快取(例如使用redis快取數據,例如使用ob進行動態頁面靜態化等等)。

(4)對mysql做主從複製,讀寫分離。 (提高mysq執行效率和查詢速度)

(5)使用nginx做負載平衡。 (將存取壓力平均分配到多型伺服器)

8、PHP可否與其它的資料庫搭配使用?

PHP與MYSQL資料庫是最優搭配,當然PHP也可以去其它的資料庫搭配使用,例如PostgreSql,SqlServer,Oracle,SqlLite等。

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

MVC三層分別指:業務模型、視圖、控制器,由控制器層呼叫模型處理數據,然後將數據映射到視圖層進行顯示。

優點是:①可以實現程式碼的重用性,避免產生程式碼冗餘;②M和V的實作程式碼分離,從而使同一個程式可以使用不同的表現形式

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

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

PHP中處理json格式的函數為json_decode( string $json [, bool $assoc ] ) ,接受一個JSON格式的字串並且把它轉換為PHP變量,參數json待解碼的json string格式的字串。 assoc當此參數為TRUE時,將傳回array而非object;

Json_encode:將PHP變數轉換成json格式。

11、Print、echo、print_r有什麼差別?

(1) echo和print都可以做輸出,不同的是,echo不是函數,沒有回傳值,而print是函數有回傳值,所以相對而言如果只是輸出echo會比較快,而print_r通常用於列印變數的相關訊息,通常在偵錯中使用。

(2) print 是列印字串

(3)print_r 則是列印複合型別 如陣列 物件

12、SESSION與COOKIE的差別?

(1)儲存位置:session儲存於伺服器,cookie儲存於瀏覽器

(2)安全性:session安全性比cookie高

(3)session為'會話服務',使用時需要開啟服務,cookie不需要開啟,可以直接用

13、PHP處理陣列的常用函數? (重點看函數的'參數'和'返回值')

(1)array() 建立數組

(2)in_array() 判斷元素是否在數組中

(3)count() 傳回數組中元素的數目

(4)array_merge() 將多個數組合併成一個數組

(5)array_diff() 比較兩個或兩個以上陣列的差異

(6)array_intersect() 取得兩個或兩個陣列以上的交集

(7)array_keys() 取得陣列的key列表

(8)array_values() 取得陣列的值清單

(9)array_unique() 刪除陣列中的重複值

(10)array_push()將一個或多個元素插入陣列的末尾(入棧)

(11)array_pop() 彈出並返回array 數組的最後一個單元(出棧)

(12)array_walk() 使用用戶自訂函數對數組中的每個元素做回呼處理

14、PHP處理字串的常用函數? (重點看函數的'參數'和'返回值')

(1)trim() 移除字串兩側的空白字元和其他字元;

(2)strlen( ) 取得字串的長度

(3)mb_strlen() 取得字串長度(可指定字元編碼,對中文字串計算長度)

(4)substr()傳回字串的一部分;

(5)str_replace() 子字串替換

(6)str_repeat () 重複一個字串

(7)is_string() 偵測變數是否是字串;

(8)str_shuffle () 隨機打亂一個字串

(9)sprintf() 傳回根據格式化字串產生的字串(通常用於取得分表後的資料表名)

(10)strstr() 尋找字串的首次出現

#(11)addslashes 使用反斜線引用字串

15、 PHP處理時間的常用函數? (重點看函數的‘參數’和‘返回值’)

(1)date() 格式化一個本地時間/日期。

(2)getdate() 取得日期/時間資訊。

(3)date_default_timezone_set() 設定預設時區。

(4)date_default_timezone_get() 傳回預設時區。

(5)mktime() 傳回一個日期的 Unix時間戳記。

(6)strtotime() 將任何字串的日期時間描述解析為Unix 時間戳

(7)strftime() 根據區域設定格式化本地時間/日期

16、PHP處理資料庫的常用函數? (重點看函數的‘參數’和‘返回值’)

請參考php手冊,認真查看,此項目非常重要

17、PHP操作文件的常用函數? (重點看函數的'參數'和'返回值')

(1)打開文件fopen()

(2)讀取文件fgets() ; 註:file_get_contents()也是讀取檔案

(3)寫入檔案fwrite() ; 註:file_put_contents()同樣可以寫入檔案

(4)關閉檔案句柄fclose()

# (5)移動/ 重新命名檔案rename()

(6)複製檔案copy()

(7)建立檔案vim 或touch

(8)刪除文件unlink()

(9)取得檔案上次存取的時間fileatime()

(10)取得檔案上次修改的時間filemtime()

(11)取得檔案大小filesize()

(12)取得檔案類型filetype()

#(13)取得檔案詳細資料state()

(14)判斷是否為目錄is_dir()

18、PHP操作目錄(資料夾)的常用函數? (重點看函數的'參數'和'返回值')

(1)開啟目錄opendir()

(2)讀取目錄readdir()

( 3)刪除目錄rmdir()

(4)關閉目錄句柄closedir()

(5)建立目錄mkdir()

(6)回傳路徑中的目錄部分dirname()

(7)取得目前工作目錄getcwd()

(8)列出指定路徑中的檔案和目錄scandir()

二、資料庫部分

常見的關係型資料庫管理系統產品有?

答案:Oracle、SQL Server、MySQL、Sybase、DB2、Access等。

SQL語言包含哪幾部分?每部分都有哪些操作關鍵字?

答:SQL語言包含資料定義(DDL)、資料操縱(DML),資料控制(DCL)和資料查詢(DQL)四個部分。

資料定義:Create Table,Alter Table,Drop Table, Craete/Drop Index等

資料操縱:Select ,insert,update,delete,

#資料控制:grant ,revoke

資料查詢:select

##完整性約束包含哪些?

資料完整性(Data Integrity)是指資料的精確(Accuracy) 和 可靠性(Reliability)。

包括:

(1)實體完整性:規定表的每一行在表中是惟一的實體。

(2)域完整性:是指表中的欄位必須滿足某種特定的資料類型約束,其中約束又包含取值範圍、精確度等規定。

(3)參照完整性:是指兩個表的主關鍵字和外關鍵字的資料應一致,並保證了表之間的資料的一致性,防止了資料遺失或無意義的數據在資料庫中擴散。

(4) 使用者定義的完整性:不同的關聯式資料庫系統依其應用環境的不同,往往還需要一些特殊的限制條件。使用者定義的完整性即是針對某個特定關係資料庫的約束條件,它反映某一具體應用必須滿足的語意要求。

什麼是事務?及其特性?

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

特性:

(1)原子性:即不可分割性,事務要麼全部被執行,要麼就全部不被執行。

(2)一致性或可串性。事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀態

(3)隔離性。在事務正確提交之前,不允許把該事務對資料的任何變更提供給任何其他事務,

(4) 持久性。交易正確提交後,其結果將永久保存在資料庫中,即使在交易提交後有了其他故障,事務的處理結果也會被保存。

簡單理解:在事務裡的操作,要嘛全部成功,要嘛全部失敗。

什麼是鎖?

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

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

基本鎖定類型:鎖定包含行級鎖定和表格層級鎖定

什麼叫視圖?遊標是什麼?

視圖是一種虛擬的表,具有和實體表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是有一個表或多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取資料更容易,相較於多表查詢。

遊標:是對查詢出來的結果集作為一個單元來有效的處理。遊標可以定在該單元中的特定行,從結果集的目前行檢索一行或多行。可以對結果集目前行做​​修改。一般不使用遊標,但是需要逐條處理資料的時候,遊標顯得十分重要。

什麼是預存程序?用什麼來呼叫?

預存程序是一個預先編譯的SQL語句,優點是允許模組化的設計,就是說只要創建一次,以後在該程式中就可以呼叫多次。如果某次操作需要執行多次SQL,使用預存程序比單純SQL語句執行快。可以用一個命令物件來呼叫預存程序。

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

索引就一種特殊的查詢表,資料庫的搜尋引擎可以利用它來加速資料的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的資料。索引可以是唯一的,建立索引允許指定單一列或是多個列。

缺點是它減慢了資料輸入的速度,同時也增加了資料庫的尺寸大小。

如何通俗地理解三個範式?

第一範式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;

第二範式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;

第三範式:3NF是對字段冗餘性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗餘。 。

什麼是基本表?什麼是視圖?

基本表是本身獨立存在的表,在 SQL 中一個關係就對應一個表。

視圖是從一個或幾個基本表匯出的表。視圖本身不獨立儲存在資料庫中,是一個虛表

試述視圖的優點?

(1) 視圖能夠簡化使用者的操作

(2) 視圖使用戶能以多種角度看待相同資料;

(3) 視圖為資料庫提供了一定程度的邏輯獨立性;

(4) 視圖能夠對機密資料提供安全保護。

NULL是什麼意思

NULL這個值表示UNKNOWN(未知):它不表示「」(空字串)。

對NULL這個值的任何比較都會產生一個NULL值。

您不能把任何值與一個 NULL值做比較,並且在邏輯上希望得到一個答案。

使用IS NULL來進行NULL判斷

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

主鍵、外鍵和索引的區別

定義:

主鍵–唯一標識一筆記錄,不能有重複的,不允許為空

外鍵–表的外鍵是另一表的主鍵, 外鍵可以有重複的, 可以是空值

索引–該欄位沒有重複值,但可以有一個空值

作用:

主鍵–用來保證資料完整性

外鍵–用來和其他表格建立聯繫用的

索引–是提高查詢排序的速度

個數:

主鍵–主鍵只能有一個

外鍵–一個表可以有多個外鍵

索引–一個表可以有多個唯一索引

你可以用什麼來確保表格裡的欄位只接受特定範圍裡的值?

Check限制,它在資料庫表格裡被定義,用來限制輸入該列的值。

說說對SQL語句最佳化有哪些方法? (選擇幾個)

(1)Where子句中:where表之間的連接必須寫在其他Where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在Where子句的末尾.HAVING最後。

(2)用EXISTS取代IN、用NOT EXISTS取代NOT IN。

(3) 避免在索引列上使用計算

(4)避免在索引列上使用IS NULL和IS NOT NULL

(5)對查詢進行最佳化,應盡量避免全表掃描,首先應考慮在where 及order by 涉及的欄位上建立索引。

(6)應盡量避免在where 子句中對欄位進行null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描

(7)應盡量避免在where子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描

SQL語句中'相關子查詢'與'非相關子查詢'有什麼區別?

(1)非相關子查詢是獨立於外部查詢的子查詢,子查詢總共執行一次,執行完畢後將值傳遞給外部查詢。

(2)相關子查詢的執行依賴外部查詢的數據,外部查詢執行一行,子查詢就執行一次。

因此非相關子查詢比相關子查詢效率高

#char和varchar的差別?

char是一種固定長度的類型,varchar則是一種可變長度的類型。

區別:

char(M)類型的資料列裡,每個值都會佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字符補足。 (在檢索作業中那些填補出來的空格字元將會被去掉)。

varchar(M)類型的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L 1位元組)。

Mysql 的儲存引擎,myisam和innodb的差別。

MyISAM 是非交易的儲存引擎;適合用於頻繁查詢的應用;表鎖,不會出現死鎖;不支援交易。適合小數據,小並發

innodb是支援事務的儲存引擎;適合插入和更新操作比較多的應用;設計合理的話是行鎖(最大區別就在鎖的層級);適合大數據,大並發。

資料表類型有哪些

MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。

MyISAM:成熟、穩定、易於管理,快速讀取。有些功能不支援(交易等),表級鎖定。

InnoDB:支援交易、外鍵等特性、資料行鎖定。空間佔用大,不支援全文索引等。

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

(1)設計良好的資料庫結構,讓部分資料冗餘,盡量避免join查詢,提高效率。

(2) 選擇合適的表格欄位資料類型和儲存引擎,適當的添加索引。

(3) 做mysql主從複製讀寫分開。

(4)將資料表分錶,減少單表中的資料量提高查詢速度。

(5)加入快取機制,例如redis,memcached等。

(6)對不常改動的頁面,產生靜態頁面(例如做ob快取)。

(7)書寫高效率的SQL。例如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.

對於大流量的網站,您採用什麼樣的方法來解決各頁訪問量統計問題?

(1) 確認伺服器是否能支撐目前訪問量。

(2) 最佳化資料庫存取。

(3)禁止外部存取連結(盜鏈), 例如圖片盜鏈。

(4)控制檔下載。

(5)做負載平衡,使用不同主機分流。

(6)使用瀏覽統計軟體,了解訪問量,有針對性的進行最佳化。

三、 物件導向部分

1、什麼是物件導向?(理解回答)

物件是一種思想,是基於以過程為導向而言的,就是說物件導向是將功能等透過物件來實現,將功能封裝進物件之中,讓物件去實現具體的細節。

物件導向有三大特徵:封裝性、繼承性、多型性。

現在純正的OO語言主要是 Java 和 C#,PHP、C 也支援OO,C是面向過程的。

2、簡述 private、 protected、 public修飾符的存取權。

private : 私有成員, 在類別的內部才可以存取。

protected : 保護成員,該類別內部和繼承類別中可以存取。

public : 公共成員,完全公開,沒有存取限制。

3、堆疊和堆疊的差別?

堆疊是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就堆疊的大小有明確的定義;

堆疊是程式運行期間動態分配的記憶體空間,你可以根據程式的運行情況來決定要分配的堆記憶體的大小。

4、XML 與 HTML 的主要區別

語法要求不同:

(1)在html中不區分大小寫,在xml中嚴格區分。

(2)在HTML中,有時不嚴格,如果上下文清楚地顯示出段落或列表鍵在何處結尾,那麼你可以省略

或之類的結束標記。在XML中,是嚴格的樹狀結構,絕對不能省略掉結束標記。

(3) 在XML中,擁有單一標記而沒有符合的結束標記的元素必須以一個/ 字元作為結尾。這樣分析器就知道不用找結束標記了。

(4)在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。

(5)在HTML中,可以擁有不含值的屬性名稱。在XML中,所有的屬性都必須帶有對應的值。

(6) 在XML文件中,空白部分不會被解析器自動刪除;但是html是過濾掉空格的。

標記不同:

(1)html使用固有的標記;而xml沒有固有的標記。

(2)Html標籤是預先定義的;XML標籤是免費的、自訂的、可擴充的。

作用不同:

(1)html是用來顯示資料的;xml是用來描述資料、存放資料的,所以可以作為持久化的媒體! Html將資料和顯示結合在一起,在頁面中顯示出這些資料;xml則將資料和顯示分開。 XML被設計用來描述數據,其焦點是數據的內容。 HTML被設計用來顯示數據,其焦點是數據的外觀。

(2)xml不是HTML的替代品,xml和html是兩種不同用途的語言。 XML 不是要替換 HTML;實際上XML 可以視為 HTML 的補充。 XML 和HTML 的目標不同HTML 的設計目標是顯示資料並集中於資料外觀,而XML的設計目標是描述資料並集中於資料的內容。

(3)對於XML最好的形容可能是: XML是一種跨平台的,與軟、硬體無關的,處理與傳輸訊息的工具。

(4)XML未來將會無所不在。 XML將成為最普遍的資料處理和資料傳輸的工具。

5、物件導向的特徵有哪些面向?

主要有封裝,繼承,多態。如果是4個方面則加上:抽象。

封裝:

封裝是確保軟體元件具有優良的模組性的基礎,封裝的目標就是要實現軟體元件的高內聚,低耦合,防止程式相互依賴性而帶來的變動影響.

繼承:

在定義和實作一個類別的時候,可以在一個已經存在的類別的基礎之上來進行,把這個已經存在的類別所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類別自動共享父類別資料和方法的機制,這是類別之間的一種關係,提高了軟體的可重複使用性和可擴展性。

多態:

多態是指程式中定義的引用變數所指向的具體類型和透過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式運行期間才確定,即一個引用變數倒底會指向哪個類別的實例對象,該引用變數發出的方法呼叫到底是哪個類別中實現的方法,必須在由程式運行期間才能決定。

抽象:

抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標相關的方面。例如,看到一隻螞蟻和大象,你能夠想像出它們的相同之處,那就是抽象。

6、抽象類別和介面的概念以及區別?

抽象類別:它是一種特殊的,不能被實例化的類,只能作為其他類別的父類使用。使用abstract關鍵字聲明。

介面:它是一種特殊的抽象類,也是一個特殊的類,使用interface宣告。

區別:

(1)抽象類別的操作透過繼承關鍵字extends實現,而介面的使用是透過implements關鍵字來實現。

(2)抽象類別中有資料成員,可以實作資料的封裝,但是介面沒有資料成員。

(3)抽象類別中可以有建構方法,但是介面沒有建構方法。

(4)抽象類別的方法可以透過private、protected、public關鍵字修飾(抽象方法不能是private),而介面中的方法只能使用public關鍵字修飾。

(5)一個類別只能繼承於一個抽象類,而一個類別可以同時實作多個介面。

(6)抽象類別中可以有成員方法的實作程式碼,而介面中不可以有成員方法的實作程式碼。

7、什麼是建構函數,什麼是析構函數,作用是什麼?

建構子(方法)是物件建立完成後第一個被物件自動呼叫的方法。它存在於每個聲明的類別中,是一個特殊的成員方法。作用是執行一些初始化的任務。 Php中使用__construct()宣告建構方法,且只能宣告一個。

析構函數(方法)作用和建構方法正好相反,是物件被銷毀之前最後一個被物件自動呼叫的方法。是PHP5中新加入的內容作用是用於實現在銷毀一個物件之前執行一些特定的操作,諸如關閉檔案和釋放記憶體等。

8、如何重載父類別的方法,舉例說明

重載,也就是覆寫父類別的方法,也就是使用子類別中的方法來取代從父類別繼承的方法,也叫方法的重寫。

覆寫父類別方法的關鍵是在子類別中建立於父類別中相同的方法包括方法的名稱、參數和傳回值類型。 PHP中只要求方法的名稱相同即可。

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

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複製一個物件時候呼叫。

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

$this 目前物件

self 當前類別

parent 目前類別的父類別

$this在目前類別中使用,使用->調用屬性和方法。

self也在目前類別中使用,不過需要使用::呼叫。

parent在類別中使用。

11、類別中如何定義常數、如何類別中呼叫常數、如何在類別外呼叫常數。

類別中的常數也就是成員常數,常數就是不會改變的量,是一個恆值。

定義常數使用關鍵字const.

例如:const PI = 3.1415326;

無論是類別內或類別外,常數的存取和變數是不一樣的,常數不需要實例化對象,

存取常數的格式都是類別名稱加作用域操作符號(雙冒號)來呼叫。

即:類別名稱 :: 類別常數名稱;

12、作用域運算元::如何使用?都在哪些場合使用?

(1)呼叫類別常數

(2)呼叫靜態方法(使用static修飾的類別方法)

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

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

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

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

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

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

四、THINKPHP部分

1、常見的PHP框架

答案:thinkPHP、laravel、yii、ci 等。

2、如何理解TP中的單一入口檔案?

ThinkPHP採用單一入口模式進行專案部署和訪問,無論完成什麼功能,一個專案都有一個統一(但不一定是唯一)的入口。應該說,所有專案都是從入口文件開始的,並且所有的專案的入口文件是類似的。

入口檔案中主要包括:

(1)定義框架路徑、專案路徑和專案名稱(可選)

(2)定義偵錯模式和運行模式的相關常數(可選)

(3)載入框架入口檔案(必須)

3、ThinkPHP中的MVC分層是什麼? (理解)

MVC 是一種將應用程式的邏輯層和表現層分開的方法。 ThinkPHP 也是基於MVC設計模式的。 MVC只是一個抽象的概念,並沒有特別明確的規定,ThinkPHP中的MVC分層大致體現在:

模型(M):模型的定義由Model類別來完成。

控制器(C):應用程式控制器(核心控制器App類別)和Action控制器都承擔了控制器的角色,Action控制器完成業務流程控制,而應用控制器則負責調度控制。

視圖(V):由View類別和模板檔案組成,模板做到了100%分離,可以獨立預覽和製作。

但實際上,ThinkPHP並不依賴M或V ,也就是說沒有模型或視圖也一樣可以運作。甚至不依賴C,這是因為ThinkPHP在Action之上還有一個總控制器,就是App控制器,負責應用程式的總調度。在沒有C的情況下,必然存在視圖V,否則就不再是完整的應用。

總而言之,ThinkPHP的MVC模式只是提供了一種敏捷開發的手段,而不是拘泥於MVC本身。

4、如何進行SQL最佳化? (關於後邊的解釋同學們可以進行理解,到時根據自己的理解把大體意思說出來即可)

(1)選擇正確的存儲引擎

MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫入操作並不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀取操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。

InnoDB 的趨勢會是一個非常複雜的儲存引擎,對於一些小的應用,它會比 MyISAM 還要慢。但是它支援「行鎖」 ,於是在寫操作比較多的時候,會更優秀。並且,他也支援更多的高階應用,例如:事務。

(2)最佳化欄位的資料型別

記住一個原則,越小的欄位會越快。如果一個表只會有幾列罷了(比如說字典表,配置表),那麼,我們就沒有理由使用 INT 來做主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。如果你不需要記錄時間,使用 DATE 會比 DATETIME 好得多。當然,你也需要留夠足夠的擴充空間。

(3)為搜尋欄位新增索引

索引不一定就是給主鍵或是唯一的欄位。如果在你的表中,有某個字段你總是要會經常用來做搜索,那麼最好是為其建立索引,除非你要搜索的字段是大的文本字段,那應該建立全文索引。

(4)避免使用Select 從資料庫讀出越多的數據,那麼查詢就會變得越慢。並且,如果你的資料庫伺服器和WEB伺服器是兩台獨立的伺服器的話,這也會增加網路傳輸的負載。即使你要查詢資料表的所有字段,也盡量不要用通配符,善用內建提供的字段排除定義也許能給帶來更多的便利。

(5)使用 ENUM 而不是 VARCHAR

ENUM 類型是非常快且緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字串。這樣一來,用這個欄位來做一些選項清單變得相當的完美。例如,性別、民族、部門和狀態之類的這些欄位的取值是有限且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。

(6)盡可能的使用 NOT NULL

除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的欄位保持 NOT NULL。 NULL其實需要額外的空間,而且,在你進行比較的時候,你的程式會更複雜。當然,這裡並不是說你就不能使用NULL了,現實情況是很複雜的,還是會有些情況下,你需要使用NULL值。

(7)固定長度的表格會更快

如果表格中的所有欄位都是「固定長度」的,整個表格會被認為是「static」 或「fixed-length 」。例如,表中沒有以下類型的欄位: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表就不是「固定長度靜態表」了,這樣,MySQL 引擎會用另一種方​​法來處理。

固定長度的表會提高效能,因為MySQL搜尋得會更快一些,因為這些固定的長度是很容易計算下一個資料的偏移量的,所以讀取的自然也會很快。而如果欄位不是定長的,那麼,每次要找下一條的話,就需要程式找到主鍵。

並且,固定長度的表也更容易被快取和重建。不過,唯一的副作用是,固定長度的字段會浪費一些空間,因為定長的字段無論你用不用,他都是要分配那麼多的空間。

5、如何理解 ThinkPHP 3.0 架構(核心 行為 驅動)中的行為?

(1)核心(Core):就是框架的核心程式碼,不可缺少的東西,TP本身是基於MVC思想開發的框架。

(2)行為(Behavior) :行為在新版ThinkPHP的架構裡面起著舉足輕重的作用,在系統核心之上,設置了很多標籤擴展位,而每個標籤位置可以依次執行各自的獨立行為。行為擴展就因此而誕生了,而且許多系統功能也是透過內建的行為擴展完成的,所有行為擴展都是可替換和增加的,由此形成了底層框架可組裝的基礎。

(3)驅動( Driver ):資料庫驅動、快取驅動、標籤庫驅動和模板引擎驅動,以及外置的類別擴充。

6、什麼是慣例配置?

所謂的慣例配置,便是框架的自帶的設定檔。該檔案在核心框架目錄下的convention.php中,配置內容如下。由於該文件屬於框架自帶的配置文件,在實際的開發過程中,主要給我們做參考實例使用,我們很少去修改該文件的配置內容,更多的是根據需求來按照慣例配置中的字段定義和註解來在模組或Common中自訂配置內容。

7、什麼是SQL注入? (理解)

SQL注入攻擊是駭客對資料庫進行攻擊的常用手段之一。

一部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,注入者可以在表單中輸入一段資料庫查詢程式碼並提交,程式將提交的資訊拼湊產生一個完整sql語句,伺服器被欺騙而執行該條惡意的SQL指令。注入者根據程式傳回的結果,成功取得一些敏感數據,甚至控制整個伺服器,這就是SQL注入。

8、ThinkPHP如何防止SQL注入? (理解)

(1)查詢條件盡量使用數組方式,這是更安全的方式;

(2)如果不得已必須使用字串查詢條件,使用預處理機制;

(3)使用綁定參數

(4)開啟資料欄位類型驗證,可以對數值資料類型做強制轉換;(3.1版本開始已經強制進行欄位類型驗證了)

(5)使用自動驗證和自動完成機制進行針對應用的自訂過濾;

(6)使用欄位類型檢查、自動驗證和自動完成機制等避免惡意資料的輸入。

9、如何開啟偵錯模式?調試模式有什麼好處?

開啟偵錯模式很簡單,只需要在入口檔案中增加一行常數定義碼:

// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define(‘APP_DEBUG’, true);

偵錯模式的優點在於: 開啟日誌記錄,任何錯誤訊息和偵錯資訊都會詳細記錄,便於調試; 關閉模板緩存,模板修改可以即時生效; 記錄SQL日誌,方便分析SQL; 關閉字段緩存,數據表字段修改不受緩存影響;嚴格檢查文件大小寫(即使是Windows平台),幫助你提前發現Linux部署問題; 可以方便用於開發過程的不同階段,包括開發、測試和演示等任何需要的情況,不同的應用模式可以配置獨立的專案設定檔。

10、TP中支援哪些設定模式?優先級?

慣例配置->應用程式配置->模式配置->調試配置->狀態配置->模組配置->擴展配置->動態配置

#以上是設定檔的載入順序,因為後面的設定會覆蓋先前的同名配置(在沒有生效的前提下),所以優先順序從右到左。

11、TP中的URL模式有哪幾種?預設是哪種?

ThinkPHP支援四種URL模式,可以透過設定URL_MODEL參數來定義,包括普通模式、PATHINFO、REWRITE和相容模式。

預設模式為:PATHINFO模式,設定URL_MODEL 為1

#12、TP中系統變數有哪些?如何取得系統變數?

(1)系統變數:SERVER、 _SERVER、SERVER、_ENV、 $_POST、 $_GET、 REQUEST、_REQUEST、REQUEST、_SESSION和$_COOKIE變數

#(2)取得系統變數:

{KaTeX parse error: Expected 'EOF', got '}' at position 25: …ver.script_name}̲ // 输出_SERVER[‘SCRIPT_NAME’]变量
{KaTeX parse error: Expected 'EOF', got '}' at position 22: …session.user_id}̲ // 输出_SESSION[‘user_id’]变量
{KaTeX parse error: Expected 'EOF', got '}' at position 21: ….get.pageNumber}̲ // 输出_GET[‘pageNumber’]变量
{KaTeX parse error: Expected 'EOF', got '}' at position 18: …ink.cookie.name}̲ // 输出_COOKIE[‘name’]变量

13、ThinkPHP框架中D函數與M函數的差別是什麼?

M方法實例化模型無需使用者為每個資料表定義模型類,D方法可以自動偵測模型類,如果存在自訂的模型類,則實例化自訂模型類,如果不存在,則會自動呼叫M方法去實例化Model基底類別。同時對於已實例化過的模型,不會重複去實例化(單例模式)。

五、smarty模板引擎

1、編譯和快取差異?

smarty的編譯過程就是把模板拿過來,把裡面的標籤替換成對應php程式碼,這就是smarty的編譯, 其實就是php和html混合的過程

smarty的快取需要手動開啟,smarty的快取就是把編譯好的檔案執行後,同時產生一份靜態的html頁面,再次造訪的時候,你造訪的就是是html檔案了,所以就效率來說,要高一些。

2、什麼是smarty? Smarty的優點是什麼?

Smarty是一個使用PHP寫出來的PHP模板引擎,目的是要使用PHP程式同美工分離,使的程式設計師改變程式的邏輯內容時不會影響到美工的頁面設計,美工重新修改頁面時不會影響到程式的程式邏輯,這在多人合作的專案中顯的尤為重要。 (也易於程式的多樣式開發)

Smarty優點

(1)速度快:相對其他模板引擎。

(2) 編譯型:採用smarty編寫的程式在執行時要編譯成一個非模板技術的PHP檔案

(3)快取技術:它可以將使用者最終看到的HTML檔案快取成一個靜態的HTML頁

(4)外掛程式技術:smarty可以自訂外掛程式。

不適合使用smarty的地方

(1)需要即時更新的內容。例如像股票顯示,它需要經常對數據進行更新

(2)小项目。小项目因为项目简单而美工与程序员兼于一人的项目

3、在模板中使用{$smarty}保留变量

{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.get.page}̲ //类似在php脚本中访问_GET[page]
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.cookies.}̲ {smarty.post.}
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.session.}̲ {smarty.server.}

在模板中访问php中的变量

5、变量调解器

2018PHP经典面试题大全汇总(更新)-PHP面试题

6、php查询mysql数据库时,查询中文结果时出现的乱码。怎么解决?

(1)文件meta(设置浏览器解析的时候)

(2)连接数据库时编码设定

(3)PHP文件中使用header函数确定编码

7、缓存机制

如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。

8、smarty的赋值和载入模板

$Smarty->assign(name,value)
$Smarty->display(‘index.html’)

9、marty模板技术的用途是什么?

为了php与html分开,美工和程序员各司其职,互不干扰。

10、smarty配置主要有哪几项?

(1)引入smarty.class.php;

(2) 实例化smarty对象;

(3)重新修改默认的模板路径;

(4)重新修改默认的编译后文件的路径;

(5)重新修改默认的配置文件的路径;

(6)重新修改默认的cache的路径。

(7) 可以设置是否开启cache。

(8)可以设置左侧和右侧定界符。

11、smarty在使用过程中需要注意哪些细节?

Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,

也就是说smarty技术将用户UI与php代码分离开。

这样程序员和美工各司其职,互不干扰。

12、smarty运用过程中要注意以下几个问题:

(1)正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;

(2)php页面中使用assign赋值 和display显示页面;

(3)smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。

六、二次开发系统(DEDE、ecshop)

1、对二次开发的理解

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核。

2、MVC

Model(模型)数据处理。

View(视图) 模板显示。

Controller(控制器) 控制流程。

MVC的概念是什么?各层主要做什么工作?

MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。

M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。

使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。

在网站开发中,

模型层一般负责对数据库表信息进行增删改查,

视图层负责显示页面内容,

控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,

执行完毕后由控制器层决定将结果assign到哪个view层。

3、二次开发程序安装后访问时候出现一些警告以及错误

根据错误,来修改服务器配置参数以及百度

4、功能,模板的更换,功能的添加修改

其实也就是面向对象的应用 用,以及模板的更换类似smarty的使用

5、用过哪些二次开发的东西?

Dedecms phpcms ecshop,基本这些的东西如果基础好了 学习起来都是没问题的。

6、像php做一次开发好,还是二次开发好?

一般中小企业都用cms系统二次开发,都是为了效率。当然如果想一次开发也行,会用框架而且时间充足的话就可以了,大企业都是团队来开发的,杜绝版权问题。

7、二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?

不是类继承而是对象组合,把实例化好的对象通过global传递进去

8、dedecms如果更换目录,后台某项就进不去了如何解决?

后台核心设置中修改成现在的 项目目录名称

9、dedecms中自定义模型的理解?

在织梦系统中有内容模型这个概念,不同内容模型可以用来构建不同内容形式的站点,在系统中自带了以下几种模型:普通文章、图集、软件、商品、分类信息、专题。通过系统自带的模型,我们可以用来构建不同类型的站点,例如:使用图集可以做一个图片站,用软件模型构建一个软件下载站点。

当然以上随系统附带的模型被称为系统模型,用户可以自己定义一些模型,比如图书、音乐专辑等,自定义了这些模型才可以构建更多内容形式的站点。

相当于我们自动添加了表结构,适应现在当前需求的变化

10、dede中概念,设计和使用模板,必须要理解下面几个概念

(1)板块(封面)模板:

指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。

(2)列表模板:

指网站某个栏目的所有文章列表的模板,一般用 “list_识别ID.htm” 命名。

(3) 档案模板:

表示文档查看页的模板,如文章模板,一般用 “article_识别ID.htm” 命名。

(4) 其它模板:

一般系统常规包含的模板有:主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。

11、dede中几种标签的使用?

列表 内容 等标签 只能在其本范围内使用,列表标签只能在列表中使用,内容标签只能在内容标签中使用。

全局标签能在所有页面中使用

12、熟悉常用类库

(例如:dedesql.class.php);熟悉系统函数库(common.func.php);熟悉自定义函数库(extend.func.php);熟悉前台入口文件(common.inc.php)

七、微信公众平台开发

1、微信运行机制

公众号与php之间用什么语言通信:Xml

Weixin.php中是如何接收公众号数据的:

$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];//接收数据 XML数据

2、消息类型

微信目前提供了7种基本消息类型,分别为:

(1)文本消息(text);

(2)图片消息(image);

(3)语音(voice)

(4)视频(video)

(5)地理位置(location);

(6)链接消息(link);

(7)事件推送(event)

类型。掌握不同的消息类型发送时的数据传递格式

3、将整个文件读入一个字符串的函数是

File_get_contents

4、常用函数

把xml数据解析成对象的函数是

simplexml_load_string( )

将字符串转换为数组的函数是___ explode_________,将数组转化为字符串的函数是____implode________.

编码 URL 字符串的字符串是____urlencode________.

5、Sprintf函数的作用

这个都是可以查手册的。

6、微信公众号出现无法提供服务的原因?

(1)网络原因 ,数据接口原因

(2)代码错误,怎么推测原因

修改的哪里检查一下,如果代码没错

可以输出数据 看一下。用php操作文件

$myfile = fopen(“newfile.txt”, “w”);
txt="aaaaaaaaaa";fwrite( txt ="aaaaaaaaaa";fwrite(txt="aaaaaaaaaa";fwrite(myfile, txt);fclose( txt);fclose(txt);fclose(myfile);

7、自定义菜单的事件推送

单击

单击跳转链接

扫码推事件

扫码推且弹出

弹出系统拍照发图的事件

弹出微信相册发图器的事件

弹出地理位置选择器的事件

8、token的作用

安全机制验证,用于微信服务器与PHP服务器之间的安全验证

9、Appid与secrect的作用

请求api接口(例如菜单的操作)时需要传appid与secrect两个值,用来获取应用的授权码

laravle面试题

PHP7 和 PHP5 的区别,具体多了哪些新特性?

性能提升了两倍

结合比较运算符 (96b4fef55684b9312718d5de63fb7121)

标量类型声明

返回类型声明

try…catch 增加多条件判断,更多 Error 错误可以进行异常处理

匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义

…… 了解更多查看文章底部链接 PHP7 新特性

为什么 PHP7 比 PHP5 性能提升了?

变量存储字节减小,减少内存占用,提升变量操作速度

改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率

改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

laravel 模块

服务提供者是什么?

服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器、注册服务容器绑定、事件监听、中间件、路由注册以及我们的应用程序都是由服务提供者引导启动的。

IoC 容器是什么?

IoC(Inversion of Control)译为 「控制反转」,也被叫做「依赖注入」(DI)。什么是「控制反转」?对象 A 功能依赖于对象 B,但是控制权由对象 A 来控制,控制权被颠倒,所以叫做「控制反转」,而「依赖注入」是实现 IoC 的方法,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。

其作用簡單來講就是利用依賴關係注入的方式,把複雜的應用程式分解為互相合作的對象,從而降低解決問題的複雜度,實現應用程式程式碼的低耦合、高擴展。

Laravel 中的服務容器是用來管理類別的依賴和執行依賴注入的工具。

Facades 是什麼?

Facades(一種設計模式,通常翻譯為外觀模式)提供了一個」static」(靜態)介面去存取註冊到 IoC 容器中的類別。提供了簡單、易記的語法,而無需記住必須手動注入或配置的長長的類別名稱。此外,由於對 PHP 動態方法的獨特用法,也讓測試起來非常容易。

Contract 是什麼?

Contract(契約)是 laravel 定義框架提供的核心服務的介面。 Contract 和 Facades 並沒有本質意義上的區別,其作用就是讓介面低耦合、更簡單。

依賴注入的原理?

這個就不解釋了吧,這是理解 IoC 容器的前提。

什麼是 Composer, 工作原理是什麼?

Composer 是 PHP 的一個依賴管理工具。工作原理就是將已開發好的擴充包從 packagist.org composer 倉庫下載到我們的應用程式中,並聲明依賴關係和版本控制。

快取

Redis、Memecached 這兩者有什麼不同?

Redis 支援更豐富的資料儲存類型,String、Hash、List、Set 和 Sorted Set。 Memcached 僅支援簡單的 key-value 結構。

Memcached key-value儲存比 Redis 採用 hash 結構來做 key-value 儲存的記憶體利用率更高。

Redis 提供了交易的功能,可以確保一系列命令的原子性

Redis 支援資料的持久化,可以將記憶體中的資料保持在磁碟中

Redis 只使用單核心,而Memcached 可以使用多核心,所以平均每一個核上Redis 在儲存小資料時比Memcached 效能更高。

Redis 如何持久化?

RDB 持久化,將 redis 在記憶體中的狀態儲存到硬碟中,相當於備份資料庫狀態。

AOF 持久化(Append-Only-File),AOF 持久化是透過保存 Redis 伺服器鎖定執行的寫入狀態來記錄資料庫的。相當於備份資料庫接收到的指令,所有寫入 AOF 的指令都是以 redis 的協定格式來保存的。

資料庫

什麼是索引,作用是什麼?常見索引類型有那些? Mysql 建立索引的原則?

索引是一種特殊的文件,它們包含著對資料表裡所有記錄的引用指針,相當於書本的目錄。其作用就是加快資料的檢索效率。常見索引類型有主鍵、唯一索引、複合索引、全文索引。

索引建立的原則

最左前綴原理

選擇區分度高的資料列作為索引

#盡量的擴充索引,不要新索引

高並發如何處理?

使用快取

優化資料庫,提升資料庫使用效率

負載平衡

PHP 的設計模式就不多講了,但SOLID 設計原則是每一位PHPer 都必須要掌握的。

以上是PHP面試題大全(值得收藏)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:toutiao.com。如有侵權,請聯絡admin@php.cn刪除