這篇文章介紹的內容是關於2017php經典面試題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
#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 、說一下你所掌握的網頁前端技術有哪些?
熟練p 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中,如果上下文清楚地顯示出段落或列表鍵在何處結尾,那麼你可以省略
或之類別的結束 標記。在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函數。
回到頂部
1、常見的PHP框架
#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、如何開啟偵錯模式?調試模式有什麼好處?
答案:開啟偵錯模式很簡單,只需要在入口檔案中增加一行常數定義碼:
//開啟調試模式
# 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基底類別。同時對於已實例化過的模型,不會重複去實例化(單例模式)。
返回頂部
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}>
<{$str| capitalize}><{*首字母大寫*}>
<{$str|upper}><{*全部大寫*}> ;
<{$str|lower}><{*全部小寫*}>
#<{$str|lower|upper}><{*全部大寫,調整從左至右*}>
<{ $leg|truncate}><{*字串截取,預設80個字元*}>
<{$leg|truncate:10}> ;<{*字串截取,前10個,包括...三個字元*}>
##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
返回頂部
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. 自訂功能表的事件推送
點選
點選跳躍連結
碼推且彈出
彈出系統拍照發圖的事件
彈出微信相簿發圖器的事件
11
## 彈出地理位置選擇器的事件
9.token的功能
安全機制驗證,用於微信伺服器與PHP伺服器之間的安全驗證##10. Appid與secrect的作用
請求api介面(例如選單的運作)時需要傳appid與secrect兩個值,用來取得應用的授權碼
#返回頂部
################## ########八、對於自身掌握的技術描述:################1. 以PHP MYSQL為方向,熟練smarty模板引擎、ThinkPHP框架、微信公眾平台開發、DEDE、ecshop等二次開發系統,對物件導向有一定的理解;資料庫方面,熟練MYSQL、MSSQL等資料庫;熟悉在linux下的PHP開發########### #2. 前端技術:熟練p CSS網頁佈局,javascript,JQuery框架、AJAX技術、photoshop圖片處理######
3. 一年的專案開發經驗,使用smarty開發過'XXXXXXXX',ThinkPHP開發過'XXXXXXXX',使用微信公眾平台開發過'就業服務網'的公眾號,使用織夢系統開發過企業站等
相關推薦:
以上是2017php經典面試題的詳細內容。更多資訊請關注PHP中文網其他相關文章!