內容簡介
本書是PHP經典圖書升級版,它既是一本關於面向對象設計與編程的書,也是一本關於如何使用工具管理PHP代碼(從協作到部署)的書。書中講解了PHP的新特性,例如匿名類以及標量參數提示和返回值類型。第5版重寫了Composer和Packagist庫的相關內容,並增加了關於Git版本控制的篇幅。示例代碼全面更新,符合PSR-1和PSR-2標準。閱讀本書能夠幫你構建實現既定目標且易於協同開發的系統,並讓你的代碼優雅、簡潔且易於理解。
作者簡介
馬特·贊德斯徹(Matt Zandstra) 20餘年Web開發經驗,曾擔任Yahoo!公司高級開發人員,現在是自由顧問和作家,為Linux Magazine、Zend.com、IBM DeveloperWorks和php[architect] Magazine等撰寫過文章。 【譯者簡介】 楊文軒 華中科技大學碩士,擅長Web開發,有豐富的對日開發經驗。現任職於日本方正股份有限公司。譯作有《圖解基礎設施設計模式》《C++性能最佳化指南》《圖解設計模式》等。
圖書目錄
第 一部分 對象
第 1章 PHP:設計和管理 2
1.1 問題 2
1.2 PHP與其他語言 3
1.3 關於本書 5
1.3.1 對象 5
1.3.2 模式 6
1.3.3 實踐 6
1.3.4 第5版新增內容 7
1.4 小結 8
第 2章 PHP和對象 9
2.1 PHP對象的偶然成功 9
2.1.1 起源:PHP/FI 9
2.1.2 語法糖:PHP 3 9
2.1.3 一場靜悄悄的革命:PHP 4 10
2.1.4 擁抱變化:PHP 5 11
2.1.5 迎頭追趕:PHP 7 12
2.2 擁護和顧慮:關於對象的爭辯 12
2.3 小結 13
第3章 對象基礎 14
3.1 類和對象 14
3.1.1 第 一個類 14
3.1.2 一個(或兩個)對象 15
3.2 設定類中的屬性 16
3.3 使用方法 18
3.4 參數和類型 21
3.4.1 基本類型 21
3.4.2 接受提示:對象類型 24
3.5 繼承 28
3.5.1 繼承問題 28
3.5.2 使用繼承 33
3.5.3 public、private和protected:管理類的訪問 38
3.6 小結 43
第4章 高級特性 44
4.1 靜態方法和屬性 44
4.2 常量屬性 47
4.3 抽象類 48
4.4 接口 50
4.5 trait 52
4.5.1 trait可以解決的問題 52
4.5.2 定義和使用trait 53
4.5.3 使用多個trait 54
4.5.4 組合使用trait與接口 55
4.5.5 通過insteadof管理方法名衝突 56
4.5.6 使用別名重寫trait的方法 57
4.5.7 在trait中使用靜態方法. 58
4.5.8 訪問宿主類的屬性 59
4.5.9 在trait中定義抽象方法 59
4.5.10 改變trait中方法的訪問許可權 60
4.6 延遲靜態綁定:static關鍵字 61
4.7 錯誤處理 65
4.8 final類和方法 73
4.9 內部錯誤類 74
4.10 使用攔截器 75
4.11 定義析構方法 81
4.12 使用__clone( )複製對象 82
4.13 定義對象的字元串值 85
4.14 回調、匿名函式和閉包 86
4.15 匿名類 90
4.16 小結 92
第5章 對象工具 93
5.1 PHP和包 93
5.1.1 PHP包和命名空間 93
5.1.2 自動載入 101
5.2 類函式和對象函式 105
5.2.1 查找類 106
5.2.2 檢查對象或類 106
5.2.3 得到指向類的完全限定的字元串引用 107
5.2.4 檢查方法 108
5.2.5 檢查類屬性 110
5.2.6 檢查繼承 110
5.2.7 方法調用 111
5.3 反射API 112
5.3.1 入門 112
5.3.2 是時候大幹一場了 113
5.3.3 檢查類 115
5.3.4 檢查方法 117
5.3.5 檢查方法參數 118
5.3.6 使用反射API 120
5.4 小結 123
第6章 對象與設計 124
6.1 定義代碼設計 124
6.2 面向對象編程與面向過程編程 125
6.2.1 職責 129
6.2.2 內聚 129
6.2.3 耦合 129
6.2.4 正交 129
6.3 選擇類 130
6.4 多態 131
6.5 封裝 132
6.6 忘記細節 133
6.7 四個方向標 133
6.7.1 代碼重複 134
6.7.2 類知道太多 134
6.7.3 的類 134
6.7.4 條件語句 134
6.8 UML 134
6.8.1 類圖 135
6.8.2 序列圖 140
6.9 小結 142
第二部分 模式
第7章 什麼是設計模式,為什麼要使用設計模式 144
7.1 什麼是設計模式 144
7.2 設計模式概要 146
7.2.1 名稱 146
7.2.2 問題 146
7.2.3 解決方案 147
7.2.4 效果 147
7.3 《設計模式》的格式 147
7.4 為什麼使用設計模式 148
7.4.1 設計模式定義了問題 148
7.4.2 設計模式定義了解決方案 148
7.4.3 設計模式與程式語言無關 148
7.4.4 模式定義了一組辭彙 148
7.4.5 模式是經過測試的 149
7.4.6 模式為協作而設計 149
7.4.7 設計模式促進優秀設計 149
7.4.8 流行的框架都使用了設計模式 150
7.5 PHP與設計模式 150
7.6 小結 150
第8章 一些模式原則 151
8.1 模式的啟示 151
8.2 組合與繼承 152
8.2.1 問題 152
8.2.2 使用組合 155
8.3 解耦 157
8.3.1 問題 157
8.3.2 解耦 159
8.4 針對接口編程,而不是針對實現編程 161
8.5 概念在變化 162
8.6 不要盲從模式 162
8.7 模式 163
8.7.1 用於生成對象的模式 163
8.7.2 用於組織對象和類的模式 163
8.7.3 面向任務的模式 163
8.7.4 企業設計模式 163
8.7.5 資料庫模式 163
8.8 小結 163
第9章 生成對象 164
9.1 生成對象的問題和解決方案 164
9.2 單例模式 168
9.2.1 問題 169
9.2.2 實現 169
9.2.3 效果 171
9.3 工廠方法模式 172
9.3.1 問題 172
9.3.2 實現 175
9.3.3 效果 177
9.4 抽象工廠模式 177
9.4.1 問題 177
9.4.2 實現 178
9.4.3 效果 180
9.5 原型模式 181
9.5.1 問題 182
9.5.2 實現 183
9.6 推向邊緣:服務定位器 186
9.7 完全隔離:依賴注入 187
9.7.1 問題 187
9.7.2 實現 188
9.7.3 效果 191
9.8 小結 191
第 10章 使面向對象編程更加靈活的模式 192
10.1 構造可靈活創建對象的類 192
10.2 組合模式 192
10.2.1 問題 193
10.2.2 實現 195
10.2.3 效果 199
10.2.4 組合模式小結 202
10.3 裝飾器模式 202
10.3.1 問題 202
10.3.2 實現 205
10.3.3 效果 209
10.4 外觀模式 209
10.4.1 問題 209
10.4.2 實現 211
10.4.3 效果 211
10.5 小結 212
第 11章 執行及描述任務 213
11.1 解釋器模式 213
11.1.1 問題 213
11.1.2 實現 214
11.1.3 解釋器模式的問題 222
11.2 策略模式 222
11.2.1 問題 222
11.2.2 實現 223
11.3 觀察者模式 227
11.4 訪問者模式 235
11.4.1 問題 235
11.4.2 實現 236
11.4.3 訪問者模式的問題 241
11.5 命令模式 242
11.5.1 問題 242
11.5.2 實現 242
11.6 空對象模式 247
11.6.1 問題 247
11.6.2 實現 249
11.7 小結 251
第 12章 企業設計模式 252
12.1 架構概述 252
12.1.1 模式 252
12.1.2 套用與分層 253
12.2 企業架構外的基礎模式 255
12.2.1 註冊表 255
12.2.2 實現 256
12.2.3 效果 260
12.3 表示層 260
12.3.1 前端控制器 261
12.3.2 套用控制器 271
12.3.3 頁面控制器 283
12.3.4 模板視圖和視圖助手 288
12.4 業務邏輯層 291
12.4.1 事務腳本 291
12.4.2 領域模型 295
12.5 小結 298
第 13章 資料庫設計模式 299
13.1 數據層 299
13.2 數據映射器 299
13.2.1 問題 300
13.2.2 實現 300
13.2.3 效果 313
13.3 標識映射 315
13.3.1 問題 315
13.3.2 實現 315
13.3.3 效果 318
13.4 工作單元 319
13.4.1 問題 319
13.4.2 實現 319
13.4.3 效果 323
13.5 延遲載入 323
13.5.1 問題 323
13.5.2 實現 324
13.5.3 效果 326
13.6 領域對象工廠 326
13.6.1 問題 326
13.6.2 實現 326
13.6.3 效果 327
13.7 標識對象 329
13.7.1 問題 329
13.7.2 實現 330
13.7.3 效果 335
13.8 選擇工廠與更新工廠模式 335
13.8.1 問題 336
13.8.2 實現 336
13.8.3 效果 340
13.9 現在映射器中還剩下什麼 340
13.10 小結 342
第三部分 實踐
第 14章 優秀(以及糟糕)的實踐 346
14.1 超越代碼 346
14.2 借輪子 347
14.3 合作愉快 348
14.4 為代碼插上翅膀 349
14.5 標準 350
14.6 Vagrant 350
14.7 測試 351
14.8 持續集成 351
14.9 小結 352
第 15章 PHP標準 353
15.1 為什麼需要標準 353
15.2 什麼是PSR 354
15.2.1 為什麼選擇PSR 354
15.2.2 哪些人需要PSR 355
15.3 編碼風格 355
15.3.1 PSR-1基礎編碼規範 356
15.3.2 PSR-2編碼風格規範 358
15.3.3 檢查和修改代碼 360
15.4 PSR-4自動載入規範 362
15.5 小結 365
第 16章 通過Composer使用和創建組件 366
16.1 什麼是Composer 366
16.2 安裝Composer 367
16.3 安裝一個(組)包 367
16.3.1 通過命令行安裝包 368
16.3.2 版本 368
16.3.3 require-dev元素 369
16.4 Composer與自動載入 370
16.5 創建自己的包 371
16.5.1 添加包信息 371
16.5.2 平台軟體包 372
16.6 通過Packagist分發包 373
16.7 私有包 376
16.8 小結 377
第 17章 用Git進行版本控制 378
17.1 為什麼進行版本控制 378
17.2 安裝Git 379
17.3 使用線上Git代碼庫 380
17.4 配置Git伺服器 382
17.5 啟動項目 384
17.6 更新與提交 387
17.7 檔案和目錄的添加與移除 390
17.7.1 添加檔案 390
17.7.2 刪除檔案 390
17.7.3 添加目錄 391
17.7.4 刪除目錄 391
17.8 標記一次發布 392
17.9 創建分支 393
17.10 小結 398
第 18章 使用PHPUnit進行測試 399
18.1 功能測試與單元測試 399
18.2 手動測試 400
18.3 引入PHPUnit 402
18.3.1 創建測試用例 402
18.3.2 斷言方法 405
18.3.3 測試異常 406
18.3.4 運行測試套件 407
18.3.5 約束 407
18.3.6 mock和stub 409
18.3.7 失敗是成功之母 412
18.4 編寫Web測試 415
18.4.1 為測試重構Web套用 415
18.4.2 簡單的Web測試 417
18.4.3 引入Selenium 419
18.5 警告 424
18.6 小結 426
第 19章 使用Phing進行自動化構建 427
19.1 Phing是什麼 427
19.2 獲取和安裝Phing 428
19.3 編寫構建文檔 428
19.3.1 目標 430
19.3.2 屬性 432
19.3.3 類型 438
19.3.4 任務 443
19.4 小結 446
第 20章 Vagrant 447
20.1 問題 447
20.2 設定 448
20.3 掛載本地目錄到Vagrant鏡像 450
20.4 配置 451
20.4.1 設定Web伺服器 452
20.4.2 設定MySQL 452
20.4.3 配置主機名 453
20.5 結束語 455
20.6 小結 455
第 21章 持續集成 456
21.1 什麼是持續集成 456
21.1.1 準備一個持續集成項目 458
21.1.2 安裝Jenkins外掛程式 467
21.1.3 設定Git公鑰 468
21.1.4 創建新項目 469
21.1.5 運行第 一次構建 472
21.1.6 配置報告 472
21.1.7 觸發構建 474
21.2 小結 476
第 22章 對象、模式和實踐 477
22.1 對象 477
22.1.1 選擇 478
22.1.2 封裝與委託 478
22.1.3 解耦 478
22.1.4 可復用性 479
22.1.5 美學 479
22.2 模式 479
22.2.1 模式給我們帶來了什麼 480
22.2.2 模式與設計原則 480
22.3 實踐 482
22.3.1 測試 482
22.3.2 標準 483
22.3.3 版本控制 483
22.3.4 自動構建 483
22.3.5 持續集成 484
22.3.6 我們遺漏了什麼 484
22.4 小結 485
附錄A 參考文獻 486
附錄B 一個簡單的解析器 488