本書的 GitHub 地址:https://github.com/todayqq/PH…
PHP 篇收集了一些常見的基礎、進階面試題,基礎的面試題不再作答。
基礎篇
- Get 和 POST 的區別
- Cookie 和 Session 的區別和關係
- 單引號和雙引號的區別
- isset 和 empty 的區別
- echo、print_r、print、var_dump 之間的區別
- 什麼是 MVC?
- 傳值和傳引用的區別?
進階篇
- 簡述 S.O.L.I.D 設計原則
-
SRP | 單一職責原則 | 一個類有且只有一個更改的原因 |
OCP | 開閉原則 | 能夠不更改類而擴充套件類的行為 |
LSP | 里氏替換原則 | 派生類可以替換基類使用 |
ISP | 介面隔離原則 | 使用客戶端特定的細粒度介面 |
DIP | 依賴反轉原則 | 依賴抽象而不是具體實現 |
- PHP7 和 PHP5 的區別,具體多了哪些新特性?
- 效能提升了兩倍
- 增加了結合比較運算子 (<=>)
- 增加了標量型別宣告、返回型別宣告
try...catch
增加多條件判斷,更多 Error 錯誤可以進行異常處理- 增加了匿名類,現在支援通過new class 來例項化一個匿名類,這可以用來替代一些“用後即焚”的完整類定義
- 為什麼 PHP7 比 PHP5 效能提升了?
- 變數儲存位元組減小,減少記憶體佔用,提升變數操作速度
- 改善陣列結構,陣列元素和 hash 對映表被分配在同一塊記憶體裡,降低了記憶體佔用、提升了 cpu 快取命中率
- 改進了函式的呼叫機制,通過優化引數傳遞的環節,減少了一些指令,提高執行效率
- 簡述一下 PHP 垃圾回收機制(GC)
PHP 5.3 版本之前都是採用引用計數的方式管理記憶體,PHP 所有的變數存在一個叫
zval
的變數容器中,當變數被引用的時候,引用計數會+1,變數引用計數變為0時,PHP 將在記憶體中銷燬這個變數。但是引用計數中的迴圈引用,引用計數不會消減為 0,就會導致記憶體洩露。
在 5.3 版本之後,做了這些優化:
- 並不是每次引用計數減少時都進入回收週期,只有根緩衝區滿額後在開始垃圾回收;
- 可以解決迴圈引用問題;
- 可以總將記憶體洩露保持在一個閾值以下。
瞭解更多可以檢視 PHP 手冊,垃圾回收機制。
- 如何解決 PHP 記憶體溢位問題
- 增大 PHP 指令碼的記憶體分配
- 變數引用之後及時銷燬
- 將資料分批處理
- 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 效能更高。
- Redis 如何實現持久化?
- RDB 持久化,將 Redis 在記憶體中的的狀態儲存到硬碟中,相當於備份資料庫狀態。
- AOF 持久化(Append-Only-File),AOF 持久化是通過儲存 Redis 伺服器鎖執行的寫狀態來記錄資料庫的。相當於備份資料庫接收到的命令,所有被寫入 AOF 的命令都是以 Redis 的協議格式來儲存的。