前 言
PHP作為一種流行的開發(fā)語言,已被應(yīng)用到全球約80%的網(wǎng)站和網(wǎng)絡(luò)中。一份統(tǒng)計(jì)資料顯示,PHP在全球被部署在超過 210萬臺服務(wù)器上,有 2.4億的網(wǎng)站在使用 PHP。PHP 如此龐大的應(yīng)用范圍,催生了一大批以掌握Linux、Nginx、MySQL、PHP(LNMP)技能為生的程序員。
PHP之所以應(yīng)用廣泛,是由于其擁有語法簡潔,函數(shù)豐富,學(xué)習(xí)成本低,開發(fā)效率高、開源軟件多等特性,以至于網(wǎng)絡(luò)上流傳著“PHP是最好的語言”的戲語。PHP的這些優(yōu)勢,讓成為PHP程序員的門檻降得很低:沒有任何編程基礎(chǔ)的同學(xué),也可以在數(shù)周時(shí)間內(nèi)掌握PHP語法,在數(shù)月時(shí)間內(nèi)開發(fā)一些小型的網(wǎng)站或應(yīng)用。
但是,要開發(fā)企業(yè)級的應(yīng)用,單靠這些PHP的基本知識是遠(yuǎn)遠(yuǎn)不夠的。一個(gè)優(yōu)秀的PHP程序員,必須掌握如下知識技能:數(shù)據(jù)結(jié)構(gòu)和算法、Linux系統(tǒng)、Nginx(或Apache)等web服務(wù)器、MySQL等關(guān)系型數(shù)據(jù)庫、Redis(或memcache)等緩存數(shù)據(jù)庫、安全漏洞的防護(hù)和修復(fù)、應(yīng)對大流量高并發(fā)、設(shè)計(jì)模式、海量數(shù)據(jù)的處理等。
筆者從事PHP開發(fā)已10年有余,深知補(bǔ)全PHP開發(fā)所需的技能樹絕非易事,但愿意拋磚引玉,將學(xué)習(xí)PHP中的技能逐個(gè)剖析,對面試中的要點(diǎn)進(jìn)行詳細(xì)講解,為同學(xué)們在PHP的學(xué)習(xí)過程中描繪出一幅路線圖,為面試過程提供一些技巧方法。
如何閱讀本書
全書共16章,分為四個(gè)部分:
第一部分(第1章):介紹了PHP開發(fā)的基礎(chǔ)知識,開發(fā)環(huán)境的搭建。通過本部分的學(xué)習(xí),讀者可以快速了解搭建開發(fā)環(huán)境的方法,熟悉PHP的基礎(chǔ)知識,為后面的學(xué)習(xí)打下基礎(chǔ)。
第二部分(第2至9章):以專題形式重點(diǎn)介紹PHP的各項(xiàng)知識,包括但不限于數(shù)據(jù)類型、變量、函數(shù)、類和對象、字符串、數(shù)組、文件與目錄、PHP 7新特性等內(nèi)容。讀者在學(xué)完本部分之后,能夠?qū)HP語言本身的知識有深入的了解。本部分提供了眾多的面試題目供讀者參考和學(xué)習(xí)。
第三部分(第10至14章)介紹程序員必須要掌握的PHP語言之外的一些知識和技能,包括關(guān)系型數(shù)據(jù)庫、非關(guān)系型數(shù)據(jù)庫、常見的數(shù)據(jù)結(jié)構(gòu)與算法、常見漏洞及其防范措施、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、設(shè)計(jì)模式、Nginx、PHP-FPM、高并發(fā)應(yīng)對、Restful、日志等。
第四部分(第15、16章):談一下面試攻略和職業(yè)規(guī)劃,包括面試的各個(gè)階段應(yīng)該準(zhǔn)備和注意的事項(xiàng),如規(guī)劃階段、準(zhǔn)備階段、面試階段、入職階段等;也包含面試成功之后的職業(yè)生涯發(fā)展,如程序員的職業(yè)發(fā)展路徑、能力框架、技術(shù)晉升、技術(shù)儲備等。
讀者對象
? 即將或正在面試的PHP初級或中級程序員
? 對PHP開發(fā)感興趣的人員
? 有一定的PHP開發(fā)經(jīng)驗(yàn),希望更深入了解的人員
? 有編程經(jīng)驗(yàn),希望轉(zhuǎn)型做PHP開發(fā)的人員
代碼下載
本書配套的代碼,請用微信掃描右邊的二維碼下載。如果有疑問,請聯(lián)系技術(shù)支持郵箱bootsaga@126.com,郵件主題為“PHP面試一戰(zhàn)到底”。
致 謝
感謝清華大學(xué)出版社的王金柱編輯,感謝他在我寫作過程中提供的幫助和支持。
謹(jǐn)以此書獻(xiàn)給我的家人,他們的幫助和理解使我能夠花費(fèi)兩年時(shí)間完成本書。
由于筆者水平有限,加之編寫時(shí)間倉促,書中難免會出現(xiàn)一些錯誤或不準(zhǔn)確、不全面的地方,懇請讀者批評指正。
閆小坤
2021年6月于北京
第1章 PHP開發(fā)基礎(chǔ)知識 1
1.1 環(huán)境搭建 1
1.1.1 下載與安裝 2
1.1.2 CLI模式 2
1.1.3 CGI模式 3
1.1.4 開發(fā)工具 6
1.2 基本語法 10
1.2.1 基本規(guī)范 10
1.2.2 數(shù)據(jù)類型 10
1.2.3 變量 11
1.2.4 常量 12
1.2.5 運(yùn)算符 13
1.2.6 流程控制 13
1.2.7 函數(shù) 15
1.2.8 字符串 16
1.2.9 數(shù)組 16
1.2.10 類與對象 17
1.2.11 異常處理 18
1.2.12 命名空間 19
1.3 本章小結(jié) 19
1.4 練習(xí) 19
第2章 數(shù)據(jù)類型 20
2.1 布爾類型 20
2.1.1 概念 20
2.1.2 面試題:冒泡排序 21
2.1.3 類型轉(zhuǎn)換 22
2.1.4 面試題:布爾數(shù)據(jù)比較 22
2.2 整型 23
2.2.1 概念 23
2.2.2 面試題:大數(shù)求和 23
2.3 浮點(diǎn)型 25
2.3.1 概念 25
2.3.2 面試題:浮點(diǎn)數(shù)的比較 25
2.3.3 面試題:證明題 26
2.3.4 面試題:比較兩個(gè)浮點(diǎn)數(shù)的大小 26
2.4 字符串 26
2.4.1 概念 26
2.4.2 面試題:從string中取其中的單個(gè)字符 27
2.4.3 面試題:求字符串表示的最大長度 27
2.4.4 面試題:反轉(zhuǎn)字符串 28
2.5 數(shù)組 29
2.6 對象 29
2.7 回調(diào)函數(shù) 29
2.7.1 概念 29
2.7.2 回調(diào)函數(shù)的使用 30
2.7.3 面試題:call_user_func()和call_user_func_array()的區(qū)別 32
2.8 迭代器 33
2.9 資源 33
2.10 NULL值 34
2.10.1 概念 34
2.10.2 面試題:NULL值比較 34
2.11 本章小結(jié) 34
2.12 練習(xí) 35
第3章 變量 36
3.1 變量引用 36
3.1.1 指針與引用 36
3.1.2 引用的取消 37
3.1.3 forech的引用陷阱 37
3.2 預(yù)定義變量 40
3.2.1 概念 40
3.2.2 面試題:執(zhí)行腳本的位置 41
3.3.3 面試題:獲取當(dāng)前訪問頁面的URL 42
3.3 垃圾回收機(jī)制 42
3.4 作用域 43
3.4.1 函數(shù)作用域 43
3.4.2 global關(guān)鍵字 44
3.4.3 引用文件的變量作用域 44
3.4.4 超全局變量 44
3.5 本章小結(jié) 45
3.6 練習(xí) 45
第4章 函數(shù) 47
4.1 匿名函數(shù)與閉包 47
4.1.1 匿名函數(shù)與閉包的概念 47
4.1.2 匿名函數(shù)里的變量作用域 48
4.1.3 面試題:匿名函數(shù)中$this的使用 49
4.1.4 面試題:閉包是什么 49
4.2 遞歸 50
4.2.1 遞歸的原理 50
4.2.2 遞歸的優(yōu)缺點(diǎn) 50
4.2.3 面試題:用遞歸實(shí)現(xiàn)斐波那契數(shù)列 51
4.2.4 面試題:二叉樹的中序遍歷 51
4.3 Lambda表達(dá)式 53
4.3.1 概念 53
4.3.2 匿名函數(shù)、閉包和Lambda表達(dá)式的關(guān)系 53
4.4 生成器(Generator)與 yield 54
4.4.1 生成器 54
4.4.2 yield 56
4.4.3 生成器的設(shè)計(jì) 56
4.4.4 面試題:用yield實(shí)現(xiàn)斐波那契數(shù)列 57
4.5 函數(shù)式編程 58
4.5.1 什么是函數(shù)編程 58
4.5.2 函數(shù)編程的理念 59
4.5.3 函數(shù)式編程的優(yōu)勢 60
4.6 本章小結(jié) 60
4.7 練習(xí) 60
第5章 類和對象 61
5.1 魔術(shù)方法 61
5.2 自動加載 62
5.2.1 __autoload 63
5.2.2 spl_autoload_register 64
5.2.3 spl_autoload 65
5.2.4 面試題:引用文件函數(shù)的區(qū)別 65
5.3 命名空間 66
5.3.1 命名空間的使用規(guī)范 66
5.3.2 面試題:命名空間 69
5.3.3 面試題:類名沖突的解決方法 69
5.4 PSR-4標(biāo)準(zhǔn) 69
5.5 本章小結(jié) 70
5.6 練習(xí) 71
第6章 字符串 73
6.1 字符串比較 73
6.2 類型轉(zhuǎn)換 74
6.2.1 字符串轉(zhuǎn)換為數(shù)字 74
6.2.2 面試題:表達(dá)式轉(zhuǎn)換為數(shù)字 75
6.2.3 其他類型轉(zhuǎn)換為字符串 75
6.3 字符集與字符編碼 76
6.3.1 字符集 76
6.3.2 UTF-8編碼規(guī)則 77
6.3.3 面試題:Unicode字符長度 78
6.3.4 Unicode與UTF-8的關(guān)系 78
6.4 字符串查找 78
6.5 關(guān)鍵詞搜索 81
6.6 子序列 83
6.7 字符串轉(zhuǎn)換操作 84
6.8 正則表達(dá)式 87
6.8.1 正則表達(dá)式基礎(chǔ) 87
6.8.2 面試中常見的正則表達(dá)式 91
6.9 本章小結(jié) 93
6.10 練習(xí) 93
第7章 數(shù)組 94
7.1 數(shù)組函數(shù) 94
7.1.1 count 94
7.1.2 natsort 95
7.1.3 array_merge 96
7.1.4 棧與隊(duì)列的操作 97
7.1.5 集合計(jì)算 98
7.2 數(shù)組排序 99
7.2.1 多維數(shù)組排序 99
7.2.2 多個(gè)數(shù)組排序 100
7.3 數(shù)組查找與搜索 102
7.3.1 面試題:找出缺失元素 102
7.3.2 面試題:刪除數(shù)組中的重復(fù)項(xiàng) 105
7.4 數(shù)組的遍歷操作 107
7.4.1 面試題:多維數(shù)組 107
7.4.2 面試題:螺旋訪問數(shù)組 107
7.5 本章小結(jié) 109
7.6 練習(xí) 109
第8章 文件與目錄 111
8.1 文件引用 111
8.1.1 文件引用方法 111
8.1.2 面試題:說明幾個(gè)文件引用函數(shù)的區(qū)別 113
8.2 BOM 頭 113
8.2.1 BOM的檢測 113
8.2.2 BOM文件的修改 114
8.3 上傳與下載 116
8.3.1 文件上傳 116
8.3.2 文件下載 118
8.3.3 面試題:文件上傳時(shí)的大小限制 119
8.4 文件操作 119
8.4.1 讀取文件函數(shù)對比 119
8.4.2 文件鎖 120
8.4.3 大文件讀寫 120
8.4.4 SPL文件處理 122
8.5 目錄操作 123
8.5.1 面試題:計(jì)算相對路徑 123
8.5.2 面試題:遍歷目錄 125
8.5.3 文件查找 126
8.6 硬連接和軟連接 126
8.6.1 概念 126
8.6.2 面試題:硬連接和軟連接 127
8.6.3 面試題:硬連接占用空間嗎 127
8.6.4 面試題:部署上線系統(tǒng)的原理 128
8.7 本章小結(jié) 129
8.8 練習(xí) 129
第9章 PHP 7新特性 130
9.1 PHP 7 的新變化 130
9.1.1 標(biāo)量類型聲明 130
9.1.2 新增操作 131
9.1.3 太空船操作符(組合比較符) 131
9.1.4 通過define()定義常量數(shù)組 132
9.1.5 匿名類 132
9.1.6 Unicode codepoint 轉(zhuǎn)譯語法 132
9.1.7 Group use declarations 133
9.1.8 錯誤處理 133
9.2 PHP 7 的執(zhí)行效率 133
9.2.1 內(nèi)存優(yōu)化 134
9.2.2 變量結(jié)構(gòu) 134
9.2.3 字符串 134
9.2.4 數(shù)組 134
9.3 PHP 7變量在內(nèi)核中的實(shí)現(xiàn) 135
9.3.1 PHP 5變量內(nèi)部實(shí)現(xiàn) 135
9.3.2 PHP 5變量問題剖析 138
9.3.3 PHP 7 變量內(nèi)部實(shí)現(xiàn) 139
9.3.4 PHP 7 與 PHP 5 變量內(nèi)部實(shí)現(xiàn)的差別 142
9.3.5 面試題:檢測鏈表中的環(huán) 142
9.4 字符串的內(nèi)核實(shí)現(xiàn) 144
9.4.1 字符串的結(jié)構(gòu) 145
9.4.2 二進(jìn)制安全 145
9.4.3 柔性數(shù)組 146
9.4.4 面試題:string 內(nèi)部實(shí)現(xiàn) 149
9.4.5 面試題:內(nèi)存對齊機(jī)制 150
9.4.6 面試題:內(nèi)存對齊機(jī)制的規(guī)則 150
9.4.7 面試題:柔性數(shù)組 150
9.4.8 面試題:二進(jìn)制安全 151
9.4.9 面試題:zend_string結(jié)構(gòu)體 151
9.5 數(shù)組的內(nèi)核實(shí)現(xiàn) 151
9.5.1 數(shù)組概述 151
9.5.2 PHP 5數(shù)組在內(nèi)核中的實(shí)現(xiàn) 152
9.5.3 PHP 7數(shù)組在內(nèi)核中的實(shí)現(xiàn) 153
9.6 從PHP 5遷移到PHP 7 154
9.7 本章小結(jié) 156
9.8 練習(xí) 156
第10章 RDS關(guān)系型數(shù)據(jù)庫 157
10.1 連接 157
10.2 執(zhí)行SQL 160
10.3 表引擎 161
10.3.1 MyISAM和InnoDB的基本概念 161
10.3.2 面試題:MyISAM與InnoDB的區(qū)別 161
10.3.3 面試題:OLAP和OLTP 161
10.3.4 OLAP 的12條規(guī)則 162
10.4 索引 163
10.5 事務(wù) 165
10.6 PDO 167
10.7 慢SQL優(yōu)化 169
10.7.1 發(fā)現(xiàn)慢SQL的方法 169
10.7.2 性能分析 170
10.7.3 性能優(yōu)化 171
10.8 數(shù)據(jù)表設(shè)計(jì) 171
10.8.1 設(shè)計(jì)實(shí)務(wù) 171
10.8.2 面試題 172
10.9 隔離級別 173
10.10 MVCC機(jī)制 177
10.11 DDL操作 177
10.12 分庫分表 178
10.13 本章小結(jié) 179
10.14 練習(xí) 179
第11章 NoSQL數(shù)據(jù)庫 180
11.1 Memcache 180
11.1.1 內(nèi)存管理 180
11.1.2 一致性哈希 181
11.2 Redis 182
11.2.1 數(shù)據(jù)結(jié)構(gòu) 182
11.2.2 面試題 184
11.2.3 位圖應(yīng)用 185
11.2.4 持久化策略 187
11.3 集群介紹 190
11.3.1 Codis 190
11.3.2 Twemproxy 191
11.3.3 Redis Cluster 191
11.3.4 面試題 192
11.4 本章小結(jié) 192
11.5 練習(xí) 192
第12章 數(shù)據(jù)結(jié)構(gòu)與算法 193
12.1 棧和隊(duì)列 193
12.1.1 棧 193
12.1.2 棧的面試題 194
12.1.3 隊(duì)列 197
12.2 鏈表 198
12.2.1 鏈表的概念 198
12.2.2 面試題 198
12.3 樹的定義及分類 200
12.3.1 樹的定義 200
12.3.2 樹的分類 200
12.3.3 樹的遍歷 204
12.3.4 二叉樹面試知識點(diǎn)總結(jié) 209
12.4 樹的應(yīng)用——字典樹 209
12.4.1 字典樹的原理 209
12.4.2 字典樹的應(yīng)用 213
12.5 排序 215
12.5.1 選擇排序 215
12.5.2 冒泡排序 216
12.5.3 插入排序 217
12.5.4 堆排序 218
12.5.5 快速排序 221
12.5.6 歸并排序 223
12.5.7 桶排序 224
12.5.8 常見排序算法總結(jié) 226
12.6 分治法 226
12.6.1 分治法的概念 226
12.6.2 分治法的面試題 227
12.7 動態(tài)規(guī)劃 230
12.7.1 斐波那契數(shù)列的動態(tài)規(guī)劃解法 230
12.7.2 動態(tài)規(guī)劃方法的兩個(gè)經(jīng)典問題 231
12.8 貪心算法 238
12.8.1 概念 238
12.8.2 面試題 239
12.8.3 霍夫曼樹 240
12.9 本章小結(jié) 242
12.10 練習(xí) 242
第13章 PHP安全知識 243
13.1 概述 243
13.2 輸入校驗(yàn) 244
13.3 XSS攻擊 248
13.4 SQL注入 251
13.5 CSRF攻擊 254
13.6 SSRF攻擊 257
13.7 短信轟炸 258
13.8 接口防刷 260
13.9 本章小結(jié) 261
13.10 練習(xí) 262
第14章 常見面試題 263
14.1 計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)面試題 263
14.2 操作系統(tǒng)相關(guān)面試題 270
14.3 設(shè)計(jì)模式相關(guān)面試題 274
14.4 Nginx相關(guān)面試題 278
14.5 PHP-FPM相關(guān)面試題 284
14.6 Linux 287
14.7 關(guān)于高并發(fā) 290
14.8 Restful風(fēng)格 292
14.9 日志 293
14.10 本章小結(jié) 294
14.11 練習(xí) 294
第15章 面試攻略 296
15.1 規(guī)劃階段 297
15.2 準(zhǔn)備階段 299
15.3 面試階段 302
15.4 Offer選擇 303
15.5 入職階段 304
15.6 面試的其他問題 306
15.7 本章小結(jié) 306
15.8 練習(xí) 306
第16章 職業(yè)漫談 307
16.1 職業(yè)發(fā)展 307
16.2 能力框架 308
16.3 工作與總結(jié) 309
16.4 技術(shù)晉升 309
16.5 技術(shù)儲備 310
16.6 PHP工程師的Plan B 311
16.7 本章小結(jié) 311
參考書目及資料 312