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

2020-07-16 10:05:53

相關推薦:《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 的區別,具體多了哪些新特性?

效能提升了兩倍

結合比較運算子 (<=>)

標量型別宣告

返回型別宣告

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面試題大全(值得收藏)的詳細內容,更多請關注TW511.COM其它相關文章!