1. 程式人生 > >php專業面試總結

php專業面試總結

{} 測試 rop 一定的 持久性 作文件 nod 是把 列表

PHP專業面試題匯總

一、PHP基礎: 2

二、數據庫部分 5

三、面向對象部分 9

四、ThinkPHP部分 12

五、smarty模板引擎 16

六、二次開發系統(DEDE、ecshop): 18

七、微信公眾平臺開發 20

八、對於自身掌握的技術描述: 22


1、PHP語言的一大優勢是跨平臺,什麽是跨平臺?一、PHP基礎:

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

2、WEB開發中數據提交方式有幾種?有什麽區別?百度使用哪種方式?

Get與post兩種方式

區別:1. Get從服務器獲取數據,post向服務器傳送數據

2. Get傳值在url中可見,post在url中不可見

4. Get傳值一般在2KB以內,post傳值大小可以在php.ini中進行設置

5. get安全性非低,post安全性較高,執行效率卻比Post高

建議:

1、get式安全性較Post式要差些包含機密信息建議用Post數據提交式;

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

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

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

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

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

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

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

熟練掌握DIV+CSS網頁布局,JavaScript,jQuery框架、photoshop圖片處理

5. AJAX的優勢是什麽?

ajax是異步傳輸技術,可以通過javascript實現,也可以通過JQuery框架實現,實現局部刷新,減輕了服務器的壓力,也提高了用戶體驗

6. 安全對一套程序來說至關重要,請說說在開發中應該註意哪些安全機制?

①防遠程提交;②防SQL註入,對特殊代碼進行過濾;③防止註冊機灌水,使用驗證碼;

7. 在程序的開發中,如何提高程序的運行效率?

①優化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;少用子查詢可用表連接代替;少用模糊查詢;②數據表中創建索引;③對程序中經常用到的數據生成緩存;

8. PHP可否與其它的數據庫搭配使用?

PHP與MYSQL數據庫是最優搭配,當然PHP也可以去其它的數據庫搭配使用,例如MSSQL等,PHP中預留了操作MSSQL的函數,只要開啟就可以使用

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有什麽區別?

① echo和print都可以做輸出,不同的是,echo不是函數,沒有返回值,而print是一個函數有返回值,所以相對而言如果只是輸出echo會更快,而print_r通常用於打印變量的相關信息,通常在調試中使用。

② print 是打印字符串

③ print_r 則是打印復合類型 如數組 對象

12. SESSION與COOKIE的區別?

①存儲位置:session存儲於服務器,cookie存儲於瀏覽器

②安全性:session安全性比cookie高

③session為‘會話服務’,在使用時需要開啟服務,cookie不需要開啟,可以直接用

14. PHP處理數組的常用函數?(重點看函數的‘參數’和‘返回值’)

①array()創建數組;②count()返回數組中元素的數目;③array_push()將一個或多個元素插入數組的末尾(入棧);④array_column()返回輸入數組中某個單一列的值;⑤array_combine()通過合並兩個數組來創建一個新數組;⑥array_reverse()以相反的順序返回數組;⑦array_unique()刪除數組中的重復值;⑧in_array()檢查數組中是否存在指定的值;

15. PHP處理字符串的常用函數?(重點看函數的‘參數’和‘返回值’)

①trim()移除字符串兩側的空白字符和其他字符;②substr_replace()把字符串的一部分替換為另一個字符串;③substr_count()計算子串在字符串中出現的次數;④substr()返回字符串的一部分;⑤strtolower()把字符串轉換為小寫字母;⑥strtoupper()把字符串轉換為大寫字母;⑦strtr()轉換字符串中特定的字符;⑧strrchr()查找字符串在另一個字符串中最後一次出現;⑨strstr()查找字符串在另一字符串中的第一次出現(對大小寫敏感);strrev()反轉字符串;strlen()返回字符串的長度;str_replace()替換字符串中的一些字符(對大小寫敏感);print()輸出一個或多個字符串;explode()把字符串打散為數組;is_string()檢測變量是否是字符串;strip_tags()從一個字符串中去除HTML標簽;mb_substr()用來截中文與英文的函數

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

date_default_timezone_get()返回默認時區。

date_default_timezone_set()設置默認時區。

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

getdate()返回日期/時間信息。

gettimeofday()返回當前時間信息。

microtime()返回當前時間的微秒數。

mktime()返回一個日期的 Unix時間戳。

strtotime()將任何英文文本的日期或時間描述解析為 Unix時間戳。

time()返回當前時間的 Unix時間戳。

17. PHP處理數據庫的常用函數?(重點看函數的‘參數’和‘返回值’)

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

18. PHP操作文件的常用函數?(重點看函數的‘參數’和‘返回值’)

①打開文件;②刪除文件;③讀取文件;④寫入文件;⑤修改文件;⑥關閉文件;⑦創建文件等等,此項非常重要,在工作中經常用來生成緩存或者靜態文件,請參照php手冊,認真查看

19. PHP操作目錄(文件夾)的常用函數?(重點看函數的‘參數’和‘返回值’)

①打開目錄;②刪除目錄;③讀取目錄;④創建目錄;⑤修改目錄;⑥關閉目錄等等,此項非常重要,在工作中經常用來創建或者刪除上傳文件的目錄,創建或者刪除緩存、靜態頁面的目錄,請參照php手冊,認真查看

返回頂部

二、數據庫部分

1. 常見的關系型數據庫管理系統產品有?

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

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

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

數據定義:Create Table,Alter Table,Drop Table, Craete/Drop Index等

數據操縱:Select ,insert,update,delete,

數據控制:grant,revoke

數據查詢:select

3. 完整性約束包括哪些?

答:數據完整性(Data Integrity)是指數據的精確(Accuracy)和可靠性(Reliability)。

分為以下四類:

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

2) 域完整性:是指表中的列必須滿足某種特定的數據類型約束,其中約束又包括取值範圍、精度等規定。

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

4) 用戶定義的完整性:不同的關系數據庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對某個特定關系數據庫的約束條件,它反映某一具體應用必須滿足的語義要求。

與表有關的約束:包括列約束(NOT NULL(非空約束))和表約束(PRIMARY KEY、foreign key、check、UNIQUE) 。

4. 什麽是事務?及其特性?

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

事務特性:

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

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

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

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

或者這樣理解:

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

5. 什麽是鎖?

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

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

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

6. 什麽叫視圖?遊標是什麽?

答:視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。

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

7. 什麽是存儲過程?用什麽來調用?

答:存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以後在該程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。可以用一個命令對象來調用存儲過程。

8. 索引的作用?和它的優點缺點是什麽?

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

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

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

第二範式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性; 第三範式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。。

10. 什麽是基本表?什麽是視圖?

答:基本表是本身獨立存在的表,在 SQL 中一個關系就對應一個表。 視圖是從一個或幾個基本表導出的表。視圖本身不獨立存儲在數據庫中,是一個虛表

11. 試述視圖的優點?

答:(1) 視圖能夠簡化用戶的操作 (2) 視圖使用戶能以多種角度看待同一數據; (3) 視圖為數據庫提供了一定程度的邏輯獨立性; (4) 視圖能夠對機密數據提供安全保護。

12. NULL是什麽意思

答:NULL這個值表示UNKNOWN(未知):它不表示“”(空字符串)。對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 NULL值進行比較,並在邏輯上希望獲得一個答案。

使用IS NULL來進行NULL判斷

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

主鍵、外鍵和索引的區別

定義:

主鍵--唯一標識一條記錄,不能有重復的,不允許為空

外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復的, 可以是空值

索引--該字段沒有重復值,但可以有一個空值

作用:

主鍵--用來保證數據完整性

外鍵--用來和其他表建立聯系用的

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

個數:

主鍵--主鍵只能有一個

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

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

14. 你可以用什麽來確保表格裏的字段只接受特定範圍裏的值?

答:Check限制,它在數據庫表格裏被定義,用來限制輸入該列的值。

觸發器也可以被用來限制數據庫表格裏的字段能夠接受的值,但是這種辦法要求觸發器在表格裏被定義,這可能會在某些情況下影響到性能。

15. 說說對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 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描

16. SQL語句中‘相關子查詢’與‘非相關子查詢’有什麽區別?

答:子查詢:嵌套在其他查詢中的查詢稱之。

子查詢又稱內部,而包含子查詢的語句稱之外部查詢(又稱主查詢)。

所有的子查詢可以分為兩類,即相關子查詢和非相關子查詢

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

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

故非相關子查詢比相關子查詢效率高

17. char和varchar的區別?

答:是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是:

char(M)類型的數據列裏,每個值都占用M個字節,如果某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列裏,每個值只占用剛好夠用的字節再加上一個用來記錄其長度的字節(即總長度為L+1字節).

18. Mysql 的存儲引擎,myisam和innodb的區別。

答:簡單的表達:

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

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

19. 數據表類型有哪些

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

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

InnoDB:支持事務、外鍵等特性、數據行鎖定。空間占用大,不支持全文索引等。

20. MySQL數據庫作發布系統的存儲,一天五萬條以上的增量,預計運維三年,怎麽優化?

a. 設計良好的數據庫結構,允許部分數據冗余,盡量避免join查詢,提高效率。

b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。

c. mysql庫主從讀寫分離。

d. 找規律分表,減少單表中的數據量提高查詢速度。

e。添加緩存機制,比如memcached,apc等。

f. 不經常改動的頁面,生成靜態頁面。

g. 書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.

21. 對於大流量的網站,您采用什麽樣的方法來解決各頁面訪問量統計問題?

答:a. 確認服務器是否能支撐當前訪問量。

b. 優化數據庫訪問。

c. 禁止外部訪問鏈接(盜鏈), 比如圖片盜鏈。

d. 控制文件下載。

e. 使用不同主機分流。

f. 使用瀏覽統計軟件,了解訪問量,有針對性的進行優化。

返回頂部

三、面向對象部分

1、什麽是面向對象?(理解著回答)

答:面向對象OO = 面向對象的分析OOA + 面向對象的設計OOD + 面向對象的編程OOP;通俗的解釋就是“萬物皆對象”,把所有的事物都看作一個個可以獨立的對象(單元),它們可以自己完成自己的功能,而不是像C那樣分成一個個函數。

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

2、簡述 private、 protected、 public修飾符的訪問權限。

答:private : 私有成員, 在類的內部才可以訪問。

protected : 保護成員,該類內部和繼承類中可以訪問。

public : 公共成員,完全公開,沒有訪問限制。

3、堆和棧的區別?

答:棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;

堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。

4、XML 與 HTML 的主要區別

答:(1) XML是區分大小寫字母的,HTML不區分。

(2) 在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,那麽你可以省略</p>或者</li>之類的結束 標記。在XML中,絕對不能省略掉結束標記。

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

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

(5) 在HTML中,可以擁有不帶值的屬性名。在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、 作用域操作符::如何使用?都在哪些場合下使用?

答:調用類常量

調用靜態方法

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

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

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

這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件後

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

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

返回頂部

四、ThinkPHP部分

1、常見的PHP框架

答:thinkPHP

yii

ZendFramework

CakePhp

sy

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

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

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

定義調試模式和運行模式的相關常量(可選)

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

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)選擇正確的存儲引擎

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

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 架構三(核心 + 行為 + 驅動)中的行為?

答:核心 + 行為 + 驅動

TP官方簡稱為:CBD

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

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

驅動( Driver ):數據庫驅動、緩存驅動、標簽庫驅動和模板引擎驅動,以及外置的類擴展。

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

6、什麽是慣例配置?

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

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

7、什麽是SQL註入?(理解)

答:SQL註入攻擊是黑客對數據庫進行攻擊的常用手段之一。一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,註入者可以在表單中輸入一段數據庫查詢代碼並提交,程序將提交的信息拼湊生成一個完整sql語句,服務器被欺騙而執行該條惡意的SQL命令。註入者根據程序返回的結果,成功獲取一些敏感數據,甚至控制整個服務器,這就是SQL註入。

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

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

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

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

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

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

9、如何開啟調試模式?調試模式有什麽好處?

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

<?Php,bv

//開啟調試模式

define(‘APP_DEBUG‘, true);

//加載框架入口文件

require ‘./ThinkPHP/ThinkPHP.php‘;

在完成開發階段部署到生產環境後,只需要刪除調試模式定義代碼即可切換到部署模式。開啟調試模式後,系統會首先加載系統默認的調試配置文件,然後加載項目的調試配置文件,調試模式的優勢在於:

開啟日誌記錄,任何錯誤信息和調試信息都會詳細記錄,便於調試;

關閉模板緩存,模板修改可以即時生效;

記錄SQL日誌,方便分析SQL;

關閉字段緩存,數據表字段修改不受緩存影響;

嚴格檢查文件大小寫(即使是Windows平臺),幫助你提前發現Linux部署問題;

可以方便用於開發過程的不同階段,包括開發、測試和演示等任何需要的情況,不同的應用模式可以配置獨立的項目配置文件。

10、TP中支持哪些配置模式?優先級?

答:ThinkPHP在項目配置上面創造了自己獨有的分層配置模式,其配置層次體現在:

慣例配置->項目配置->調試配置->分組配置->擴展配置->動態配置

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

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

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

默認模式為:PATHINFO模式,設置URL_MODEL 為1

12、TP中系統變量有哪些?如何獲取系統變量?

答:獲取系統變量的方法:

只需要在Action中調用下面方法:

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

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}保留變量

{$smarty.get.page} //類似在php腳本中訪問$_GET[page]

{smarty.cookies.}

{smarty.post.}

{smarty.session.}

{smarty.server.}

4.在模板中訪問php中的變量

在php腳本中有系統常量和自定義常量兩種,同樣這兩種常量在Smarty模板中也可以被訪問,而且不需要從php中分配,只要通過{$smarty}保留變量就可以直接輸出常量的值。在模板中輸出常量的示例:

{$smarty.const._MY_CONST_VAL}

{$smarty.const.__FILE__}

5.變量調解器

{$var|modifier1|modifier2|........}

<{$str}><br>

<{$str|capitalize}><{*首字母大寫*}><br>

<{$str|upper}><{*全部大寫*}><br>

<{$str|lower}><{*全部小寫*}><br>

<{$str|lower|upper}><{*全部大寫,調節從左至右*}><br>

<{$leg|truncate}><{*字符串截取,默認80個字符*}><br>

<{$leg|truncate:10}><{*字符串截取,前10個,包括...三個字符*}><br>

6. php查詢mysql數據庫時,查詢中文結果時出現的亂碼。怎麽解決????

1.文件屬性(另存為)

2.文件meta(設置瀏覽器解析的時候)

3. 連接數據庫時編碼設定

4. 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代碼段,所有的註釋,變量,函數都要包含在定界符內。

A.{}

B. foreach

C. if else

D. include

E. Literal

返回頂部

六、二次開發系統(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)

類型。掌握不同的消息類型發送時的數據傳遞格式

4. 將整個文件讀入一個字符串的函數是

File_get_contents

5、常用函數

把xml數據解析成對象的函數是

simplexml_load_string( )

將字符串轉換為數組的函數是___ explode_________,將數組轉化為字符串的函數是____implode________.

編碼 URL 字符串的字符串是____urlencode________.

6. Sprintf函數的作用

這個都是可以查手冊的。

7. 微信公眾號出現無法提供服務的原因?

1. 網絡原因 ,數據接口原因

2. 代碼錯誤,怎麽推測原因

修改的哪裏檢查一下,如果代碼沒錯

可以輸出數據 看一下。用php操作文件

$myfile = fopen("newfile.txt", "w");

$txt ="aaaaaaaaaa";

fwrite($myfile, $txt);

fclose($myfile);

8. 自定義菜單的事件推送

單擊

單擊跳轉鏈接

掃碼推事件

掃碼推且彈出

彈出系統拍照發圖的事件

彈出微信相冊發圖器的事件

彈出地理位置選擇器的事件

9.token的作用

安全機制驗證,用於微信服務器與PHP服務器之間的安全驗證
10. Appid與secrect的作用

請求api接口(例如菜單的操作)時需要傳appid與secrect兩個值,用來獲取應用的授權碼

返回頂部

八、對於自身掌握的技術描述:

1. 以PHP+MYSQL為方向,熟練掌握smarty模板引擎、ThinkPHP框架、微信公眾平臺開發、DEDE、ecshop等二次開發系統,對面向對象有一定的理解;數據庫方面,熟練掌握MYSQL、MSSQL等數據庫;熟悉在linux下的PHP開發

2. 前端技術:熟練掌握DIV+CSS網頁布局,javascript,JQuery框架、AJAX技術、photoshop圖片處理

3. 一年的項目開發經驗,使用smarty開發過‘XXXXXXXX’,ThinkPHP開發過‘XXXXXXXX’,使用微信公眾平臺開發過‘就業服務網’的公眾號,使用織夢系統開發過企業站等

php專業面試總結