基礎篇
一.Get 和 POST 的區(qū)別
表單提交中get和post方式的區(qū)別有5點
1.get是從服務器上獲取數(shù)據(jù),post是向服務器傳送數(shù)據(jù)。
2.get是把參數(shù)數(shù)據(jù)隊列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個字段一一對應,在URL中可以看到。post是通過HTTPpost機制,將表單內(nèi)各個字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
3.對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request.Form獲取提交的數(shù)據(jù)。
4.get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
5.get安全性非常低,post安全性較高。
二.HTTP請求:get與post方法的區(qū)別
HTTP 定義了與服務器交互的不同方法,最基本的方法是 get 和 post。事實上 get 適用于多數(shù)請求,而保留 post僅用于更新站點。
根據(jù) HTTP 規(guī)范,get 用于信息獲取,而且應該是安全的和冪等的。所謂安全的意味著該操作用于獲取信息而非修改信息。
換句話說,get 請求一般不應產(chǎn)生副作用。冪等的意味著對同一 URL的多個請求應該返回同樣的結果。完整的定義并不像看起來那樣嚴格。
從根本上講,其目標是當用戶打開一個鏈接時,她可以確信從自身的角度來看沒有改變資源。比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。
反之亦然。post請求就不那么輕松了。post 表示可能改變服務器上的資源的請求。仍然以新聞站點為例,讀者對文章的注解應該通過 post請求實現(xiàn),因為在注解提交之后站點已經(jīng)不同了(比方說文章下面出現(xiàn)一條注解);
在FORM提交的時候,如果不指定Method,則默認為get請求,F(xiàn)orm中提交的數(shù)據(jù)將會附加在url之后,以?分開與url分開。
字母數(shù)字字符原樣發(fā)送,但空格轉(zhuǎn)換為“+“號,其它符號轉(zhuǎn)換為%XX,其中XX為該符號以16進制表示的ASCII(或ISOLatin-1)值。get請求請?zhí)峤坏臄?shù)據(jù)放置在HTTP請求協(xié)議頭中,而post提交的數(shù)據(jù)則放在實體數(shù)據(jù)中;
三.單引號和雙引號的區(qū)別
在PHP中,字符串的定義可以使用單引號,也可以使用雙引號。但是必須使用同一種單或雙引號來定義字符串,如:‘Hello"和“Hello'為非法的字符串定義。
定義字符串時,只有一種引號被視為定義符,即單引號或雙引號。于是,如果一個字符串由雙引號開始,那么只有雙引號被分析器解析。這樣,你就可以在雙引號串中包含任何其他字符,甚至單引號。
四.isset 和 empty 的區(qū)別
empty方法:
變量不存在,返回true
變量存在,值為空,返回true
變量存在,值不為空,返回false
isset方法:
變量存在,返回true
變量不存在,返回false
五.echo、print_r、print、var_dump 之間的區(qū)別
echo()函數(shù):輸出一個或多個字符串。實際上它并不是一個函數(shù),所以不必對它使用括號,直接用echo就行。然而,如果您希望向echo()傳遞一個以上的參數(shù),使用括號將會生成解析錯誤。echo()函數(shù)比print()速度稍快一點。echo輸出多個字符串時,用逗號隔開。
print()函數(shù):輸出一個或多個字符串。同echo一樣,實際上它并不是一個函數(shù)。print有返回值,而echo沒有,當其執(zhí)行失敗時返回false,成功則返回true,速度比echo稍慢。只能打印出簡單類型變量的值,如:int、string。
print_r()函數(shù):能打印出復雜類型變量的值。利用print_r()可以打印出整個數(shù)組內(nèi)容及結構,按照一定格式顯示鍵和元素,事實上,它不僅僅用于打印,而是用于打印關于變量的易于理解的信息。
var_dump()函數(shù):判斷一個變量的類型與長度,并輸出變量的數(shù)值,如果變量有值,輸出的是變量的值,并返回數(shù)據(jù)類型。此函數(shù)顯示關于一個或多個表達式的結構信息,包括表達式的類型和值。數(shù)組將遞歸展開值,通過縮進顯示其結構。
六.什么是 MVC?
1)什么是MVC?
簡單的說就是將網(wǎng)站源碼分類、分層。
2)MVC三個字母的含義:
M:Model 模型,負責數(shù)據(jù)庫操作。
V:View 視圖,負責調(diào)用Model調(diào)取數(shù)據(jù),再調(diào)用模板,展示出最終效果。
C:Controller 控制器,程序的入口,決定改調(diào)用哪個View,并告訴View該做什么。
如此說來,程序的執(zhí)行順序是C-V-M 或 C-M ,和MVC的名字正好相反。
3)為什么要MVC?
1.能使網(wǎng)站程序物理結構更合理。
當用PHP建設一個網(wǎng)站的時候,最笨的方法,你可能把每個頁面建成一個PHP文件。如果你的網(wǎng)站只有 index.php,menu.php.article.php 三個頁面,那你可以不用MVC,但我們做一般的網(wǎng)站的時候,動輒幾十個頁面,把所有頁面放在根目錄顯然不是我們所能接受的,于是你需要一個合理的思想去將你的代碼分類,按功能把他們分成不同的目錄,且由程序智能的載入調(diào)用,這就是MVC要幫助你做的。
2.使代碼更容易維護。
我們再來看單個頁面,最笨的方法,就是PHP代碼與HTML代碼混合,這顯然不夠好,你在維護網(wǎng)站的時候不得不區(qū)分哪里是PHP,哪里是HTML, 這對于一個程序員來說,簡直只災難。于是很多人就使用Smarty,這樣就可以將“數(shù)據(jù)處理”與“頁面展示”分開來,這樣做的確不錯,也有很多人正在這么 做,但這還不是MVC,MVC要做的就是將“數(shù)據(jù)處理”再分為“邏輯處理”與“數(shù)據(jù)庫操作”,這就是所說的分層。
這樣當你的程序錯誤或想要修改的時候,就變得很輕松了,當頁面顯示錯誤的時候,你就去檢查V或模板文件;當邏輯有問題的時候,你就去檢查C和V;當你數(shù)據(jù)庫操作錯誤就去檢查M。其實MVC一般要把PHP的一個頁面分割為4個頁面,分別是C,V,M,模板。各司其職,方便管理。
3.有利于代碼復用。
MVC會把一般會把一個大的功能放在一個目錄下,也就是由一個C去管理。
七.傳值和傳引用的區(qū)別?
php傳值:在函數(shù)范圍內(nèi),改變變量值的大小,都不會影響到函數(shù)外邊的變量值。
PHP傳引用:在函數(shù)范圍內(nèi),對值的任何改變,在函數(shù)外部也有所體現(xiàn),因為傳引用傳的是內(nèi)存地址。
傳值:和copy是一樣的。打個比方,我有一橦房子,我給你建筑材料,你建了一個根我的房子一模一樣的房子,你在你的房子做什么事都不會影響到我,我在我的房子里做什么事也不會影響到你,彼此獨立。
傳引用:類似于C語言的指針了,感覺差不多。打個比方,我有一橦房子,我給你一把鑰匙,我們二個都可以進入這個房子,你在房子做什么都會影響到我。
優(yōu)缺點:傳值會很耗時間,特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作,傳送引用,函數(shù)內(nèi)的任何操作等同于對傳送變量的操作,傳送大型變量時效率高!
八.Cookie 和 Session 的區(qū)別和關系
1.Cookie 在客戶端(瀏覽器),Session 在服務器端。
2.Session 比 Cookie 安全性更高。
3.單個 Cookie 保存的數(shù)據(jù)不能超過 4K。
4.Session 是基于 Cookie,如果瀏覽器禁用了 Cookie,Session 也會失效(但是可以通過其它方式實現(xiàn),比如在 url 中傳遞 Session ID)。
進階篇
一.簡述 S.O.L.I.D 設計原則
SRP 單一職責原則 —個類有且只有一個更改的原因
OCP 開閉原則 能夠不更改類而擴展類的行為
LSP 里氏替換原則 派生類可以替換基類使用
lSP 接口隔離原則 使用客戶端特定的細粒度接口
DIP 依賴反轉(zhuǎn)原則 依賴抽象而不是具體實現(xiàn)
二.列舉一些 PHP 中的設計模式?
單例模式:保證在整個應用程序的生命周期中,任何一個時刻,單例類的實例都只存在一個,同時這個類還必須提供一個訪問該類的全局訪問點。
工廠模式:定義一個創(chuàng)建對象的接口,但是讓子類去實例化具體類。工廠方法模式讓類的實例化延遲到子類中。
觀察者模式:觀察者模式有時也被稱作發(fā)布/訂閱模式,該模式用于為對象實現(xiàn)發(fā)布/訂閱功能:一旦主體對象狀態(tài)發(fā)生改變,與之關聯(lián)的觀察者對象會收到通知,并進行相應操作。
適配器模式:適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以在一起工作。
依賴注入模式:依賴注入(Dependency Injection)是控制反轉(zhuǎn)(Inversion of Control)的一種實現(xiàn)方式。要實現(xiàn)控制反轉(zhuǎn),通常的解決方案是將創(chuàng)建被調(diào)用者實例的工作交由 IoC 容器來完成,然后在調(diào)用者中注入被調(diào)用者(通過構造器/方法注入實現(xiàn)),這樣我們就實現(xiàn)了調(diào)用者與被調(diào)用者的解耦,該過程被稱為依賴注入。
門面模式:門面模式(Facade)又稱外觀模式,用于為子系統(tǒng)中的一組接口提供一個一致的界面。
三.PHP7 和 PHP5 的區(qū)別,具體多了哪些新特性?
1.性能提升了兩倍
2.增加了結合比較運算符 (<=>)
3.增加了標量類型聲明、返回類型聲明
4.try...catch 增加多條件判斷,更多 Error 錯誤可以進行異常處理
5.增加了匿名類,現(xiàn)在支持通過new class 來實例化一個匿名類,這可以用來替代一些“用后即焚”的完整類定義
四.為什么 PHP7 比 PHP5 性能提升了?
1.變量存儲字節(jié)減小,減少內(nèi)存占用,提升變量操作速度
2.改善數(shù)組結構,數(shù)組元素和 hash 映射表被分配在同一塊內(nèi)存里,降低了內(nèi)存占用、提升了 cpu 緩存命中率
3.改進了函數(shù)的調(diào)用機制,通過優(yōu)化參數(shù)傳遞的環(huán)節(jié),減少了一些指令,提高執(zhí)行效率
五.簡述一下 PHP 垃圾回收機制(GC)
PHP 5.3 版本之前都是采用引用計數(shù)的方式管理內(nèi)存,PHP 所有的變量存在一個叫 zval 的變量容器中,當變量被引用的時候,引用計數(shù)會+1,變量引用計數(shù)變?yōu)?時,PHP 將在內(nèi)存中銷毀這個變量。但是引用計數(shù)中的循環(huán)引用,引用計數(shù)不會消減為 0,就會導致內(nèi)存泄露。
在 5.3 版本之后,做了這些優(yōu)化:
1.并不是每次引用計數(shù)減少時都進入回收周期,只有根緩沖區(qū)滿額后在開始垃圾回收;
2.可以解決循環(huán)引用問題;
3.可以總將內(nèi)存泄露保持在一個閾值以下。
六.如何解決 PHP 內(nèi)存溢出問題
1.增大 PHP 腳本的內(nèi)存分配
2.變量引用之后及時銷毀
3.將數(shù)據(jù)分批處理
七.Redis、Memecached 這兩者有什么區(qū)別?
1.Redis 支持更加豐富的數(shù)據(jù)存儲類型,String、Hash、List、Set 和 Sorted Set。Memcached 僅支持簡單的 key-value 結構。
2.Memcached key-value存儲比 Redis 采用 hash 結構來做 key-value 存儲的內(nèi)存利用率更高。
3.Redis 提供了事務的功能,可以保證一系列命令的原子性
4.Redis 支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中
5.Redis 只使用單核,而 Memcached 可以使用多核,所以平均每一個核上 Redis 在存儲小數(shù)據(jù)時比 Memcached 性能更高。
八.Redis 如何實現(xiàn)持久化?
RDB 持久化,將 Redis 在內(nèi)存中的的狀態(tài)保存到硬盤中,相當于備份數(shù)據(jù)庫狀態(tài)。
AOF 持久化(Append-Only-File),AOF 持久化是通過保存 Redis 服務器鎖執(zhí)行的寫狀態(tài)來記錄數(shù)據(jù)庫的。
相當于備份數(shù)據(jù)庫接收到的命令,所有被寫入 AOF 的命令都是以 Redis 的協(xié)議格式來保存的。
Web 安全防范
一.CSRF 是什么?如何防范?
CSRF(Cross-site request forgery)通常被叫做「跨站請求偽造」,可以這么理解:攻擊者盜用用戶身份,從而欺騙服務器,來完成攻擊請求。
防范措施:
1.使用驗證碼
2.給每一個請求添加令牌 token 并驗證
二.XSS 是什么?如何防范?
XSS(Cross Site Scripting),跨站腳本攻擊,攻擊者往 Web 頁面里插入惡意 Script 代碼,當用戶瀏覽該頁之時,嵌入其中Web 里面的 Script 代碼會被執(zhí)行,從而達到惡意攻擊用戶的目的。
防止 XSS 攻擊的方式有很多,其核心的本質(zhì)是:永遠不要相信用戶的輸入數(shù)據(jù),始終保持對用戶數(shù)據(jù)的過濾。
三.什么是 SQL 注入?如何防范?
SQL 注入就是攻擊者通過一些方式欺騙服務器,結果執(zhí)行了一些不該被執(zhí)行的 SQL。
SQL 注入的常見場景
1.數(shù)據(jù)庫里被注入了大量的垃圾數(shù)據(jù),導致服務器運行緩慢、崩潰。
2.利用 SQL 注入暴露了應用程序的隱私數(shù)據(jù)
防范措施:
1.保持對用戶數(shù)據(jù)的過濾
2.不要使用動態(tài)拼裝 SQL
3.增加輸入驗證,比如驗證碼
4.對隱私數(shù)據(jù)加密,禁止明文存儲
點關注 不迷路
好了各位,以上就是這篇文章的全部內(nèi)容了,能看到這里的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這里把它整理成了PDF和文檔,如果有需要的可以戳這里https://shimo.im/docs/rjJttdvCJpYtHpW3/ 《進階PHP月薪30k>>>架構師成長路線【視頻、面試文檔免費獲取】》