一 、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()
二 、資料庫部分
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) 用戶定義的完整性:不同的關系資料庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件,用戶定義的完整性即是針對某個特定關系資料庫的約束條件,它反映某一具體應用必須滿足的語意要求,
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)使用瀏覽統計軟體,了解訪問量,有針對性的進行優化,
三、 面向物件部分
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、變數調解器
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面試題
1、PHP7 和 PHP5 的區別,具體多了哪些新特性?
性能提升了兩倍
結合比較運算子 ()
標量型別宣告
回傳型別宣告
try…catch 增加多條件判斷,更多 Error 錯誤可以進行例外處理
匿名類,現在支持通過new class 來實體化一個匿名類,這可以用來替代一些“用后即焚”的完整類定義
為什么 PHP7 比 PHP5 性能提升了?
變量存盤位元組減小,減少記憶體占用,提升變數操作速度
改善陣列結構,陣列元素和 hash 映射表被分配在同一塊記憶體里,降低了記憶體占用、提升了 cpu 快取命中率
改進了函式的呼叫機制,通過優化引數傳遞的環節,減少了一些指令,提高執行效率
laravel 模塊
1、服務提供者是什么?
服務提供者是所有 Laravel 應用程式引導啟動的中心, Laravel 的核心服務器、注冊服務容器系結、事件監聽、中間件、路由注冊以及我們的應用程式都是由服務提供者引導啟動的,
2、IoC 容器是什么?
IoC(Inversion of Control)譯為 「控制反轉」,也被叫做「依賴注入」(DI),什么是「控制反轉」?物件 A 功能依賴于物件 B,但是控制權由物件 A 來控制,控制權被顛倒,所以叫做「控制反轉」,而「依賴注入」是實作 IoC 的方法,就是由 IoC 容器在運行期間,動態地將某種依賴關系注入到物件之中,
其作用簡單來講就是利用依賴關系注入的方式,把復雜的應用程式分解為互相合作的物件,從而降低解決問題的復雜度,實作應用程式代碼的低耦合、高擴展,
Laravel 中的服務容器是用于管理類的依賴和執行依賴注入的工具,
3、Facades 是什么?
Facades(一種設計模式,通常翻譯為外觀模式)提供了一個”static”(靜態)介面去訪問注冊到 IoC 容器中的類,提供了簡單、易記的語法,而無需記住必須手動注入或配置的長長的類名,此外,由于對 PHP 動態方法的獨特用法,也使測驗起來非常容易,
Contract 是什么?
Contract(契約)是 laravel 定義框架提供的核心服務的介面,Contract 和 Facades 并沒有本質意義上的區別,其作用就是使介面低耦合、更簡單,
4、依賴注入的原理?
這個就不解釋了吧,這是理解 IoC 容器的前提,
5、什么是 Composer, 作業原理是什么?
Composer 是 PHP 的一個依賴管理工具,作業原理就是將已開發好的擴展包從 packagist.org composer 倉庫下載到我們的應用程式中,并宣告依賴關系和版本控制,
快取
1、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 性能更高,
2、Redis 如何實作持久化?
RDB 持久化,將 redis 在記憶體中的的狀態保存到硬碟中,相當于備份資料庫狀態,
AOF 持久化(Append-Only-File),AOF 持久化是通過保存 Redis 服務器鎖執行的寫狀態來記錄資料庫的,相當于備份資料庫接收到的命令,所有被寫入 AOF 的命令都是以 redis 的協議格式來保存的,
資料庫
1、什么是索引,作用是什么?常見索引型別有那些?Mysql 建立索引的原則?
索引是一種特殊的檔案,它們包含著對資料表里所有記錄的參考指標,相當于書本的目錄,其作用就是加快資料的檢索效率,常見索引型別有主鍵、唯一索引、復合索引、全文索引,
索引創建的原則
最左前綴原理
選擇區分度高的列作為索引
盡量的擴展索引,不要新建索引
2、高并發如何處理?
使用快取
優化資料庫,提升資料庫使用效率
負載均衡
PHP 的設計模式就不多講了,但是 SOLID 設計原則是每一位 PHPer 都必須要掌握的,
點關注,不迷路
好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是人才,之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這里把它整理成了PDF和檔案,如果有需要的可以
點擊進入暗號: 博客園


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的PHP技術交流群953224940
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/19495.html
標籤:PHP
