php面試題2018

一 、PHP基礎部分

 

一、PHP語言的一大優點是跨平臺,什麼是跨平臺?javascript

PHP的運行環境最優搭配爲Apache+MySQL+PHP,此運行環境能夠在不一樣操做系統(例如windows、Linux等)上配置,不受操做系統的限制,因此叫跨平臺php

 

二、WEB開發中數據提交方式有幾種?有什麼區別?百度使用哪一種方式?html

Get與post兩種方式
區別:
(1)url可見性:get 方式url參數可見,post 不可見前端

(2)可緩存性:get 方式是能夠緩存的,post 方式不能夠緩存。java

(3)傳輸數據大小:get通常傳輸數據大小不超過2k-4k(根據瀏覽器不一樣,限制不同,但相差不大);post 請求傳輸數據的大小根據php.ini 配置文件設定,也能夠無限大。mysql

(4)數據傳輸上:get 方式經過url地址欄拼接參數進行傳輸,post 方式經過body體進行傳輸。nginx

建議:
一、get式安全性較Post式要差些包含機密信息建議用Post數據提交式;
二、作數據查詢建議用Get式;作數據添加、修改或刪除建議用Post方式;
百度使用的get方式,由於能夠從它的URL中看出laravel

 

三、掌握PHP的哪些框架、模板引擎、系統等程序員

框架:框架有不少,例如CI、Yii、Laravel等等,我們學過的是thinkphp
模板引擎:也有不少,在課本中有,我們學過的是smarty
系統:有不少,例如:康盛的產品(uchome、supesite、discuzX等),帝國系統、DEDE(織夢)、ecshop等,我們學過的是DEDECMS、Ecshop面試

 

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

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

 

五、AJAX的優點是什麼?

ajax是異步傳輸技術,能夠經過javascript實現,也能夠經過JQuery框架實現,實現局部刷新,減輕了服務器的壓力,也提升了用戶體驗。

 

六、安全對一套程序來講相當重要,請說說在開發中應該注意哪些安全機制?

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

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

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

 

七、在程序的開發中,如何提升程序的運行效率?

(1)優化SQL語句,查詢語句中儘可能不使用select *,用哪一個字段查哪一個字段;少用子查詢可用錶鏈接代替;少用模糊查詢。

(2)數據表中建立索引。

(3)對程序中常常用到的數據生成緩存(好比使用redis緩存數據,好比使用ob進行動態頁面靜態化等等)。

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

(5)使用nginx作負載均衡。(將訪問壓力平均分配到多態服務器)

 

八、PHP能否與其它的數據庫搭配使用?

PHP與MYSQL數據庫是最優搭配,固然PHP也能夠去其它的數據庫搭配使用,例如PostgreSql,SqlServer,Oracle,SqlLite等。

 

九、如今編程中常常採起MVC三層結構,請問MVC分別指哪三層,有什麼優勢?

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

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

 

十、對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格式。

 

十一、Print、echo、print_r有什麼區別?

(1) echo和print均可以作輸出,不一樣的是,echo不是函數,沒有返回值,而print是一個函數有返回值,因此相對而言若是隻是輸出echo會更快,而print_r一般用於打印變量的相關信息,一般在調試中使用。
(2) print 是打印字符串
(3)print_r 則是打印複合類型 如數組 對象

 

十二、SESSION與COOKIE的區別?

(1)存儲位置:session存儲於服務器,cookie存儲於瀏覽器
(2)安全性:session安全性比cookie高
(3)session爲‘會話服務’,在使用時須要開啓服務,cookie不須要開啓,能夠直接用

 

1三、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()  使用用戶自定義函數對數組中的每一個元素作回調處理

 

1四、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  使用反斜線引用字符串

 

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

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

(2)getdate()  取得日期/時間信息。

(3)date_default_timezone_set() 設定默認時區。

(4)date_default_timezone_get() 返回默認時區。

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

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

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

 

1六、PHP處理數據庫的經常使用函數?(重點看函數的‘參數’和‘返回值’)

請參照php手冊,認真查看,此項很是重要

 

1七、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()

 

1八、PHP操做目錄(文件夾)的經常使用函數?(重點看函數的‘參數’和‘返回值’)

(1)打開目錄 opendir()

(2)讀取目錄 readdir()

(3)刪除目錄 rmdir()

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

(5)建立目錄 mkdir()

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

(7)取得當前工做目錄  getcwd()

(8)列出指定路徑中的文件和目錄  scandir()

 

二 、數據庫部分

 

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

答:Oracle、SQL Server、MySQL、Sybase、DB二、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) 用戶定義的完整性:不一樣的關係數據庫系統根據其應用環境的不一樣,每每還須要一些特殊的約束條件。用戶定義的完整性便是針對某個特定關係數據庫的約束條件,它反映某一具體應用必須知足的語義要求。
 

 

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

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

特性:

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

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

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

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

簡單理解:在事務裏的操做,要麼所有成功,要麼所有失敗。

 

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的區別?

char是一種固定長度的類型,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數據庫做發佈系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?

(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.

 

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

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

(2) 優化數據庫訪問。

(3)禁止外部訪問連接(盜鏈), 好比圖片盜鏈。

(4)控制文件下載。

(5)作負載均衡,使用不一樣主機分流。

(6)使用瀏覽統計軟件,瞭解訪問量,有針對性的進行優化。

 

 

3、 面向對象部分

 

一、什麼是面向對象?(理解着回答)

面向對象是一種思想,是基於面向過程而言的,就是說面向對象是將功能等經過對象來實現,將功能封裝進對象之中,讓對象去實現具體的細節。

面向對象有三大特徵:封裝性、繼承性、多態性。

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

 

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

private : 私有成員, 在類的內部才能夠訪問。

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

public : 公共成員,徹底公開,沒有訪問限制。

 

三、堆和棧的區別?

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

堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。

 

四、XML 與 HTML 的主要區別

語法要求不一樣:

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

(2)在HTML中,有時不嚴格,若是上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你能夠省略</p>或者</li>之類的結束標記。在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將成爲最廣泛的數據處理和數據傳輸的工具。

 

五、面向對象的特徵有哪些方面?

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

封裝:
封裝是保證軟件部件具備優良的模塊性的基礎,封裝的目標就是要實現軟件部件的高內聚,低耦合,防止程序相互依賴性而帶來的變更影響.

繼承:
在定義和實現一個類的時候,能夠在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容做爲本身的內容,並能夠加入若干新的內容,或修改原來的方法使之更適合特殊的須要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關係,提升了軟件的可重用性和可擴展性。

多態:
多態是指程序中定義的引用變量所指向的具體類型和經過該引用變量發出的方法調用在編程時並不肯定,而是在程序運行期間才肯定,即一個引用變量倒底會指向哪一個類的實例對象,該引用變量發出的方法調用究竟是哪一個類中實現的方法,必須在由程序運行期間才能決定。

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

 

六、抽象類和接口的概念以及區別?

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

接口:它是一種特殊的抽象類,也是一個特殊的類,使用interface聲明。

區別:

(1)抽象類的操做經過繼承關鍵字extends實現,而接口的使用是經過implements關鍵字來實現。

(2)抽象類中有數據成員,能夠實現數據的封裝,可是接口沒有數據成員。

(3)抽象類中能夠有構造方法,可是接口沒有構造方法。

(4)抽象類的方法能夠經過private、protected、public關鍵字修飾(抽象方法不能是private),而接口中的方法只能使用public關鍵字修飾。

(5)一個類只能繼承於一個抽象類,而一個類能夠同時實現多個接口。

(6)抽象類中能夠有成員方法的實現代碼,而接口中不能夠有成員方法的實現代碼。

 

七、什麼是構造函數,什麼是析構函數,做用是什麼?

構造函數(方法)是對象建立完成後第一個被對象自動調用的方法。它存在於每一個聲明的類中,是一個特殊的成員方法。做用是執行一些初始化的任務。Php中使用__construct()聲明構造方法,而且只能聲明一個。

析構函數(方法)做用和構造方法正好相反,是對象被銷燬以前最後一個被對象自動調用的方法。是PHP5中新添加的內容做用是用於實如今銷燬一個對象以前執行一些特定的操做,諸如關閉文件和釋放內存等。

 

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

重載,即覆蓋父類的方法,也就是使用子類中的方法替換從父類中繼承的方法,也叫方法的重寫。

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

 

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

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複製一個對象時候調用。

 

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

$this 當前對象

self 當前類

parent 當前類的父類

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

self也在當前類中使用,不過須要使用::調用。

parent在類中使用。

 

十一、類中如何定義常量、如何類中調用常量、如何在類外調用常量。

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

定義常量使用關鍵字const.

例如:const PI = 3.1415326;

不管是類內仍是類外,常量的訪問和變量是不同的,常量不須要實例化對象,

訪問常量的格式都是類名加做用域操做符號(雙冒號)來調用。

即:類名 :: 類常量名;

 

十二、做用域操做符::如何使用?都在哪些場合下使用?

(1)調用類常量

(2)調用靜態方法(使用static修飾的類方法)

 

1三、__autoload()方法的工做原理是什麼?

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

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

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

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

使用自動載入的魔術函數能夠沒必要要寫不少個include或者require函數。

 

 

 

4、THINKPHP部分

 

一、常見的PHP框架

答:thinkPHP、laravel、yii、ci 等。

 

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

ThinkPHP採用單一入口模式進行項目部署和訪問,不管完成什麼功能,一個項目都有一個統一(但不必定是惟一)的入口。應該說,全部項目都是從入口文件開始的,而且全部的項目的入口文件是相似的。

入口文件中主要包括:

(1)定義框架路徑、項目路徑和項目名稱(可選)
(2)定義調試模式和運行模式的相關常量(可選)
(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自己。

 

四、如何進行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搜尋得會更快一些,由於這些固定的長度是很容易計算下一個數據的偏移量的,因此讀取的天然也會很快。而若是字段不是定長的,那麼,每一次要找下一條的話,須要程序找到主鍵。
而且,固定長度的表也更容易被緩存和重建。不過,惟一的反作用是,固定長度的字段會浪費一些空間,由於定長的字段不管你用不用,他都是要分配那麼多的空間。

 

五、如何理解 ThinkPHP 3.0 架構(核心 + 行爲 + 驅動)中的行爲?

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

(2)行爲(Behavior) :行爲在新版ThinkPHP的架構裏面起着舉足輕重的做用,在系統核心之上,設置了不少標籤擴展位,而每一個標籤位置能夠依次執行各自的獨立行爲。行爲擴展就所以而誕生了,並且不少系統功能也是經過內置的行爲擴展完成的,全部行爲擴展都是可替換和增長的,由此造成了底層框架可組裝的基礎。

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

六、什麼是慣例配置?

所謂的慣例配置,即是框架的自帶的配置文件。該文件在覈心框架目錄下的convention.php中,配置內容以下。因爲該文件屬於框架自帶的配置文件,在實際的開發過程當中,主要給咱們作參考實例使用,咱們不多去修改該文件的配置內容,更多的是根據需求來按照慣例配置中的字段定義和註釋來在模塊或者Common中自定義配置內容。

 

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

SQL注入攻擊是黑客對數據庫進行攻擊的經常使用手段之一。

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

 

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

(1)查詢條件儘可能使用數組方式,這是更爲安全的方式;

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

(3)使用綁定參數

(4)開啓數據字段類型驗證,能夠對數值數據類型作強制轉換;(3.1版本開始已經強制進行字段類型驗證了)

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

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

 

九、如何開啓調試模式?調試模式有什麼好處?

開啓調試模式很簡單,只須要在入口文件中增長一行常量定義代碼:

  1.  
    // 開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false
  2.  
    define( 'APP_DEBUG', true);

調試模式的優點在於: 開啓日誌記錄,任何錯誤信息和調試信息都會詳細記錄,便於調試; 關閉模板緩存,模板修改能夠即時生效; 記錄SQL日誌,方便分析SQL; 關閉字段緩存,數據表字段修改不受緩存影響; 嚴格檢查文件大小寫(即便是Windows平臺),幫助你提早發現Linux部署問題; 能夠方便用於開發過程的不一樣階段,包括開發、測試和演示等任何須要的狀況,不一樣的應用模式能夠配置獨立的項目配置文件。

 

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

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

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

 

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

ThinkPHP支持四種URL模式,能夠經過設置URL_MODEL參數來定義,包括普通模式、PATHINFO、REWRITE和兼容模式。
默認模式爲:PATHINFO模式,設置URL_MODEL 爲1

 

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

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

(2)獲取系統變量:

{$Think.server.script_name} // 輸出$_SERVER['SCRIPT_NAME']變量

{$Think.session.user_id} // 輸出$_SESSION['user_id']變量

{$Think.get.pageNumber} // 輸出$_GET['pageNumber']變量

{$Think.cookie.name}  // 輸出$_COOKIE['name']變量

 

 

1三、ThinkPHP框架中D函數與M函數的區別是什麼?

M方法實例化模型無需用戶爲每一個數據表定義模型類,D方法能夠自動檢測模型類,若是存在自定義的模型類,則實例化自定義模型類,若是不存在,則會自動調用M方法去實例化Model基類。同時對於已實例化過的模型,不會重複去實例化(單例模式)。

 

 

5、smarty模板引擎

 

一、編譯和緩存區別?

smarty的編譯過程就是把模板拿過來,把裏面的標籤替換成相應php代碼,這就是smarty的編譯, 其實就是php和html混合的過程
smarty的緩存須要手動開啓,smarty的緩存就是把編譯好的文件執行後,同時生成一份靜態的html頁面,再次訪問的時候,你訪問的就是是html文件了,因此就效率來講,要高一些。

 

二、什麼是smarty? Smarty的優勢是什麼?

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

Smarty優勢

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

(2) 編譯型:採用smarty編寫的程序在運行時要編譯成一個非模板技術的PHP文件

(3)緩存技術:它能夠將用戶最終看到的HTML文件緩存成一個靜態的HTML頁

(4)插件技術:smarty能夠自定義插件。


不適合使用smarty的地方

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

(2)小項目。小項目由於項目簡單而美工與程序員兼於一人的項目

 

三、在模板中使用{$smarty}保留變量

{$smarty.get.page} //相似在php腳本中訪問$_GET[page]
{$smarty.cookies.}
{$smarty.post.}
{$smarty.session.}
{$smarty.server.}

 

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

 

五、變量調解器

2018PHP經典面試題大全彙總(更新)-PHP面試題

 

六、php查詢mysql數據庫時,查詢中文結果時出現的亂碼。怎麼解決?

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

(2)鏈接數據庫時編碼設定

(3)PHP文件中使用header函數肯定編碼

 

七、緩存機制

若是開啓了緩存,smarty同時生成一份靜態的html頁面,若是在設定的時間沒有過時,再次訪問的時候,你訪問的就是是html文件了,減小了讀取數據庫,因此就效率來講,要高一些。

 

八、smarty的賦值和載入模板

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

 

九、marty模板技術的用途是什麼?

爲了php與html分開,美工和程序員各司其職,互不干擾。

 

十、smarty配置主要有哪幾項?

(1)引入smarty.class.php;

(2) 實例化smarty對象;

(3)從新修改默認的模板路徑;

(4)從新修改默認的編譯後文件的路徑;

(5)從新修改默認的配置文件的路徑;

(6)從新修改默認的cache的路徑。

(7) 能夠設置是否開啓cache。

(8)能夠設置左側和右側定界符。

 

十一、smarty在使用過程當中須要注意哪些細節?

Smarty是基於MVC概念的一種模板引擎,它將一個頁面程序分紅了兩部分來實現:即視圖層和控制層,
也就是說smarty技術將用戶UI與php代碼分離開。
這樣程序員和美工各司其職,互不干擾。

 

十二、smarty運用過程當中要注意如下幾個問題:

(1)正確配置smarty。主要要實例化smarty對象,配置smarty模板文件的路徑;

(2)php頁面中使用assign賦值 和display顯示頁面;

(3)smarty模板文件中不容許出現php代碼段,全部的註釋,變量,函數都要包含在定界符內。

 

6、二次開發系統(DEDE、ecshop)

 

一、對二次開發的理解

二次開發,簡單的說就是在現有的軟件上進行定製修改,功能的擴展,而後達到本身想要的功能,通常來講都不會改變原有系統的內核。

二、MVC

Model(模型)數據處理。
View(視圖) 模板顯示。
Controller(控制器) 控制流程。
MVC的概念是什麼?各層主要作什麼工做?
MVC(即模型-視圖-控制器)是一種軟件設計模式或者說編程思想。
M指Model模型層,V是View視圖層(顯示層或者用戶界面),C是Controller控制器層。
使用mvc的目的是實現M和V分離,從而使得一個程序能夠輕鬆使用不一樣的用戶界面。
在網站開發中,
模型層通常負責對數據庫表信息進行增刪改查,
視圖層負責顯示頁面內容,
控制器層在M和V之間起到調節做用,控制器層決定調用哪一個model類的哪一個方法,
執行完畢後由控制器層決定將結果assign到哪一個view層。

 

三、二次開發程序安裝後訪問時候出現一些警告以及錯誤

根據錯誤,來修改服務器配置參數以及百度

 

四、功能,模板的更換,功能的添加修改

其實也就是面向對象的應用 用,以及模板的更換相似smarty的使用

 

五、用過哪些二次開發的東西?

Dedecms phpcms ecshop,基本這些的東西若是基礎好了 學習起來都是沒問題的。

 

六、像php作一次開發好,仍是二次開發好?

通常中小企業都用cms系統二次開發,都是爲了效率。固然若是想一次開發也行,會用框架並且時間充足的話就能夠了,大企業都是團隊來開發的,杜絕版權問題。

 

七、二次開發過程當中不少類與類之間進行之間的方法訪問,是經過什麼方式傳遞的?

不是類繼承而是對象組合,把實例化好的對象經過global傳遞進去

 

八、dedecms若是更換目錄,後臺某項就進不去了如何解決?

後臺核心設置中修改爲如今的 項目目錄名稱

 

九、dedecms中自定義模型的理解?

在織夢繫統中有內容模型這個概念,不一樣內容模型能夠用來構建不一樣內容形式的站點,在系統中自帶了如下幾種模型:普通文章、圖集、軟件、商品、分類信息、專題。經過系統自帶的模型,咱們能夠用來構建不一樣類型的站點,例如:使用圖集能夠作一個圖片站,用軟件模型構建一個軟件下載站點。
固然以上隨系統附帶的模型被稱爲系統模型,用戶能夠本身定義一些模型,好比圖書、音樂專輯等,自定義了這些模型才能夠構建更多內容形式的站點。
至關於咱們自動添加了表結構,適應如今當前需求的變化

 

十、dede中概念,設計和使用模板,必需要理解下面幾個概念

(1)板塊(封面)模板:
指網站主頁或比較重要的欄目封面頻道使用的模板,通常用「index_識別ID.htm」命名,此外,用戶單獨定義的單個頁面或自定義標記,也可選是否支持板塊模板標記,若是支持,系統會用板塊模板標記引擎去解析後才輸出內容或生成特定的文件。

(2)列表模板:
指網站某個欄目的全部文章列表的模板,通常用 「list_識別ID.htm」 命名。

(3) 檔案模板:
表示文檔查看頁的模板,如文章模板,通常用 「article_識別ID.htm」 命名。

(4) 其它模板:
通常系統常規包含的模板有:主頁模板、搜索模板、RSS、JS編譯功能模板等,此外用戶也能夠自定義一個模板建立爲任意文件。

 

十一、dede中幾種標籤的使用?

列表 內容 等標籤 只能在其本範圍內使用,列表標籤只能在列表中使用,內容標籤只能在內容標籤中使用。
全局標籤能在全部頁面中使用

 

十二、熟悉經常使用類庫

(例如:dedesql.class.php);熟悉系統函數庫(common.func.php);熟悉自定義函數庫(extend.func.php);熟悉前臺入口文件(common.inc.php)

 

 

7、微信公衆平臺開發

 

一、微信運行機制

公衆號與php之間用什麼語言通訊:Xml
Weixin.php中是如何接收公衆號數據的:
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//接收數據 XML數據

 

二、消息類型

微信目前提供了7種基本消息類型,分別爲:
(1)文本消息(text);
(2)圖片消息(image);
(3)語音(voice)
(4)視頻(video)
(5)地理位置(location);
(6)連接消息(link);
(7)事件推送(event)
類型。掌握不一樣的消息類型發送時的數據傳遞格式

 

三、將整個文件讀入一個字符串的函數是

File_get_contents

 

四、經常使用函數

把xml數據解析成對象的函數是
simplexml_load_string( )
將字符串轉換爲數組的函數是___ explode_________,將數組轉化爲字符串的函數是____implode________.
編碼 URL 字符串的字符串是____urlencode________.

 

五、Sprintf函數的做用

這個都是能夠查手冊的。

 

六、微信公衆號出現沒法提供服務的緣由?

(1)網絡緣由 ,數據接口緣由
(2)代碼錯誤,怎麼推測緣由
修改的哪裏檢查一下,若是代碼沒錯
能夠輸出數據 看一下。用php操做文件
$myfile = fopen("newfile.txt", "w");
$txt ="aaaaaaaaaa";
fwrite($myfile, $txt);
fclose($myfile);

 

七、自定義菜單的事件推送

單擊
單擊跳轉連接
掃碼推事件
掃碼推且彈出
彈出系統拍照發圖的事件
彈出微信相冊發圖器的事件
彈出地理位置選擇器的事件

 

八、token的做用

安全機制驗證,用於微信服務器與PHP服務器之間的安全驗證

 

九、Appid與secrect的做用

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

 

基礎是重中之重,建議複習一下 https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79251726 

相關文章
相關標籤/搜索