溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP面試題之ThinkPHP的相關(guān)問題示例

發(fā)布時間:2021-03-10 09:39:07 來源:億速云 閱讀:234 作者:小新 欄目:編程語言

這篇文章主要介紹PHP面試題之ThinkPHP的相關(guān)問題示例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

     

1、常見的PHP框架

答:thinkPHP、yii、ZendFramework、CakePhp、sy

      2、如何理解TP中的單一入口文件?

答:ThinkPHP采用單一入口模式進行項目部署和訪問,無論完成什么功能,一個項目都有一個統(tǒng)一(但不一定是唯一)的入口。應(yīng)該說,所有項目都是從入口文件開始的,并且所有的項目的入口文件是類似的,入口文件中主要包括:

定義框架路徑、項目路徑和項目名稱(可選)

定義調(diào)試模式和運行模式的相關(guān)常量(可選)

載入框架入口文件(必須)

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

答:MVC 是一種將應(yīng)用程序的邏輯層和表現(xiàn)層進行分離的方法。ThinkPHP 也是基于MVC設(shè)計模式的。MVC只是一個抽象的概念,并沒有特別明確的規(guī)定,ThinkPHP中的MVC分層大致體現(xiàn)在:

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

控制器(C):應(yīng)用控制器(核心控制器App類)和Action控制器都承擔(dān)了控制器的角色,Action控制器完成業(yè)務(wù)過程控制,而應(yīng)用控制器負責(zé)調(diào)度控制。

視圖(V):由View類和模板文件組成,模板做到了100%分離,可以獨立預(yù)覽和制作。

但實際上,ThinkPHP并不依賴M或者V ,也就是說沒有模型或者視圖也一樣可以工作。甚至也不依賴C,這是因為ThinkPHP在Action之上還有一個總控制器,即App控制器,負責(zé)應(yīng)用的總調(diào)度。在沒有C的情況下,必然存在視圖V,否則就不再是一個完整的應(yīng)用。

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

      4、如何進行SQL優(yōu)化?(關(guān)于后邊的解釋同學(xué)們可以進行理解,到時根據(jù)自己的理解把大體意思說出來即可)

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

MySQL為例,包括有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。

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

InnoDB 的趨勢會是一個非常復(fù)雜的存儲引擎,對于一些小的應(yīng)用,它會比 MyISAM 還慢。但是它支持“行鎖” ,于是在寫操作比較多的時候,會更優(yōu)秀。并且,他還支持更多的高級應(yīng)用,比如:事務(wù)。

(2)優(yōu)化字段的數(shù)據(jù)類型

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

(3)為搜索字段添加索引

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

(4)避免使用Select *從數(shù)據(jù)庫里讀出越多的數(shù)據(jù),那么查詢就會變得越慢。并且,如果你的數(shù)據(jù)庫服務(wù)器和WEB服務(wù)器是兩臺獨立的服務(wù)器的話,這還會增加網(wǎng)絡(luò)傳輸?shù)呢撦d。即使你要查詢數(shù)據(jù)表的所有字段,也盡量不要用*通配符,善用內(nèi)置提供的字段排除定義也許能給帶來更多的便利。

(5)使用 ENUM 而不是 VARCHAR

ENUM 類型是非??旌途o湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字符串。這樣一來,用這個字段來做一些選項列表變得相當(dāng)?shù)耐昝馈@?,性別、民族、部門和狀態(tài)之類的這些字段的取值是有限而且固定的,那么,你應(yīng)該使用 ENUM 而不是 VARCHAR。

(6)盡可能的使用 NOT NULL

除非你有一個很特別的原因去使用 NULL 值,你應(yīng)該總是讓你的字段保持 NOT NULL。 NULL其實需要額外的空間,并且,在你進行比較的時候,你的程序會更復(fù)雜。 當(dāng)然,這里并不是說你就不能使用NULL了,現(xiàn)實情況是很復(fù)雜的,依然會有些情況下,你需要使用NULL值。

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

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

固定長度的表會提高性能,因為MySQL搜尋得會更快一些,因為這些固定的長度是很容易計算下一個數(shù)據(jù)的偏移量的,所以讀取的自然也會很快。而如果字段不是定長的,那么,每一次要找下一條的話,需要程序找到主鍵。并且,固定長度的表也更容易被緩存和重建。不過,唯一的副作用是,固定長度的字段會浪費一些空間,因為定長的字段無論你用不用,他都是要分配那么多的空間。

      5、如何理解 ThinkPHP 3.0 架構(gòu)三(核心 + 行為 + 驅(qū)動)中的行為?

答:核心 + 行為 + 驅(qū)動

TP官方簡稱為:CBD

核心(Core):就是框架的核心代碼,不可缺少的東西,TP本身是基于MVC思想開發(fā)的框架。

行為(Behavior) :行為在新版ThinkPHP的架構(gòu)里面起著舉足輕重的作用,在系統(tǒng)核心之上,設(shè)置了很多標(biāo)簽擴展位,而每個標(biāo)簽位置可以依次執(zhí)行各自的獨立行為。行為擴展就因此而誕生了,而且很多系統(tǒng)功能也是通過內(nèi)置的行為擴展完成的,所有行為擴展都是可替換和增加的,由此形成了底層框架可組裝的基礎(chǔ)。

驅(qū)動( Driver ):數(shù)據(jù)庫驅(qū)動、緩存驅(qū)動、標(biāo)簽庫驅(qū)動和模板引擎驅(qū)動,以及外置的類擴展。

框架,即framework。其實就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。

      6、什么是慣例配置?

答:慣例配置上一頁下一頁慣例重于配置是系統(tǒng)遵循的一個重要思想,系統(tǒng)內(nèi)置有一個慣例配置文件(位于系統(tǒng)目錄下面的Conf\convention.php),按照大多數(shù)的使用對常用參數(shù)進行了默認配置。所以,對應(yīng)用項目的配置文件,往往只需要配置和慣例配置不同的或者新增的配置參數(shù),如果你完全采用默認配置,甚至可以不需要定義任何配置文件。

慣例配置文件會被系統(tǒng)自動加載,無需在項目中進行加載。

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

答:SQL注入攻擊是黑客對數(shù)據(jù)庫進行攻擊的常用手段之一。一部分程序員在編寫代碼的時候,沒有對用戶輸入數(shù)據(jù)的合法性進行判斷,注入者可以在表單中輸入一段數(shù)據(jù)庫查詢代碼并提交,程序?qū)⑻峤坏男畔⑵礈惿梢粋€完整sql語句,服務(wù)器被欺騙而執(zhí)行該條惡意的SQL命令。注入者根據(jù)程序返回的結(jié)果,成功獲取一些敏感數(shù)據(jù),甚至控制整個服務(wù)器,這就是SQL注入。

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

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

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

(3)開啟數(shù)據(jù)字段類型驗證,可以對數(shù)值數(shù)據(jù)類型做強制轉(zhuǎn)換;(3.1版本開始已經(jīng)強制進行字段類型驗證了)

(4)使用自動驗證和自動完成機制進行針對應(yīng)用的自定義過濾;

(5)使用字段類型檢查、自動驗證和自動完成機制等避免惡意數(shù)據(jù)的輸入。

      9、如何開啟調(diào)試模式?調(diào)試模式有什么好處?

答:開啟調(diào)試模式很簡單,只需要在入口文件中增加一行常量定義代碼:

在完成開發(fā)階段部署到生產(chǎn)環(huán)境后,只需要刪除調(diào)試模式定義代碼即可切換到部署模式。開啟調(diào)試模式后,系統(tǒng)會首先加載系統(tǒng)默認的調(diào)試配置文件,然后加載項目的調(diào)試配置文件,調(diào)試模式的優(yōu)勢在于: 開啟日志記錄,任何錯誤信息和調(diào)試信息都會詳細記錄,便于調(diào)試; 關(guān)閉模板緩存,模板修改可以即時生效; 記錄SQL日志,方便分析SQL; 關(guān)閉字段緩存,數(shù)據(jù)表字段修改不受緩存影響; 嚴格檢查文件大小寫(即使是Windows平臺),幫助你提前發(fā)現(xiàn)Linux部署問題; 可以方便用于開發(fā)過程的不同階段,包括開發(fā)、測試和演示等任何需要的情況,不同的應(yīng)用模式可以配置獨立的項目配置文件。

      10、TP中支持哪些配置模式?優(yōu)先級?

答:ThinkPHP在項目配置上面創(chuàng)造了自己獨有的分層配置模式,其配置層次體現(xiàn)在: 慣例配置->項目配置->調(diào)試配置->分組配置->擴展配置->動態(tài)配置

以上是配置文件的加載順序,因為后面的配置會覆蓋之前的同名配置(在沒有生效的前提下),所以優(yōu)先順序從右到左。

      11、TP中的URL模式有哪幾種?默認是哪種?

答:ThinkPHP支持四種URL模式,可以通過設(shè)置URL_MODEL參數(shù)來定義,包括普通模式、PATHINFO、REWRITE和兼容模式。

默認模式為:PATHINFO模式,設(shè)置URL_MODEL 為1

      12、TP中系統(tǒng)變量有哪些?如何獲取系統(tǒng)變量?

答:獲取系統(tǒng)變量的方法:

只需要在Action中調(diào)用下面方法:

$this->方法名("變量名",["過濾方法"],["默認值"])

      13、ThinkPHP框架中D函數(shù)與M函數(shù)的區(qū)別是什么?

答:M方法實例化模型無需用戶為每個數(shù)據(jù)表定義模型類,D方法可以自動檢測模型類,如果存在自定義的模型類,則實例化自定義模型類,如果不存在,則會自動調(diào)用M方法去實例化Model基類。同時對于已實例化過的模型,不會重復(fù)去實例化(單例模式)。

以上是“PHP面試題之ThinkPHP的相關(guān)問題示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI