第一部分 工具和概念
第1章 PHP與現代軟件開發 2
1.1 PHP的作用 2
1.1.1 PHP流行的原因 3
1.1.2 剋服PHP的局限 5
1.2 語言、原則和模式 7
1.2.1 敏捷方法:從蠻乾到巧乾 7
1.2.2 PHP 5和軟件趨勢 8
1.2.3 麵嚮對象編程進化的規律 8
1.2.4 設計模式 9
1.2.5 重構 10
1.2.6 單元測試和TDD 10
1.3 小結 13
第2章 PHP中的對象 14
2.1 對象基礎 14
2.1.1 為什麼將PHP與Java相比較 15
2.1.2 對象和類 15
2.1.3 Hello world 15
2.1.4 構造函數:創建和初始化對象 16
2.1.5 繼承和關鍵字extends 18
2.1.6 繼承構造函數 19
2.2 異常處理 20
2.2.1 異常的工作原理 20
2.2.2 何時使用異常與返迴代碼 22
2.2.3 創建自己的異常類 23
2.2.4 用異常替換PHP內置的嚴重錯誤 24
2.2.5 不要過度使用異常 24
2.3 PHP 4和PHP 5中的對象引用 24
2.3.1 對象引用的工作原理 25
2.3.2 對象引用的優勢 26
2.3.3 引用何時沒有用處 27
2.4 方法調用的攔截和類的實例化 27
2.4.1 什麼是方法重載 27
2.4.2 PHP中的Java式方法重載 27
2.4.3 麵嚮方麵的體驗:記錄方法調用的日誌 28
2.4.4 自動加載類 30
2.5 小結 31
第3章 有效使用PHP類 32
3.1 可見性:私有和受保護的方法與變量 32
3.1.1 對方法可見性的要求 33
3.1.2 何時使用私有方法 34
3.1.3 何時使用受保護方法 34
3.1.4 讓實例變量保持private或protected屬性 35
3.1.5 私有變量和受保護變量的存取 36
3.1.6 兩全其美——通過攔截來控製變量 37
3.1.7 final類和方法 38
3.2 沒有對象的類:類方法、類變量和類常量 39
3.2.1 類(靜態)方法 40
3.2.2 何時使用類方法 41
3.2.3 類變量 41
3.2.4 類常量 42
3.2.5 PHP中常量的限製 43
3.3 抽象類和方法(函數) 45
3.3.1 什麼是抽象類和方法 45
3.3.2 使用抽象類 45
3.4 類的類型提示 46
3.4.1 類型提示的作用 46
3.4.2 何時使用類型提示 47
3.5 接口 48
3.5.1 什麼是接口 49
3.5.2 PHP中需要接口嗎 49
3.5.3 用接口讓設計更清晰 50
3.5.4 用接口改善類的類型提示 50
3.5.5 PHP 5與Java中的接口 51
3.6 小結 52
第4章 理解對象和類 53
4.1 對象和類的優點 54
4.1.1 類幫助組織 54
4.1.2 可以告訴對象要做什麼 55
4.1.3 多態性 55
4.1.4 對象讓代碼更易讀 56
4.1.5 類幫助消除重復性代碼 59
4.1.6 可以重用對象和類 60
4.1.7 避免牽一發而動全身 61
4.1.8 對象提供類型安全 61
4.2 好設計的標準 62
4.2.1 不要混淆結果和含義 64
4.2.2 透明性 64
4.2.3 簡單設計 64
4.2.4 一次並且隻有一次 65
4.3 什麼是對象 67
4.3.1 對象來自虛構世界 67
4.3.2 域對象基礎 68
4.4 小結 70
第5章 理解類關係 71
5.1 繼承 71
5.1.1 將繼承作為思考工具 72
5.1.2 繼承重構 73
5.2 對象組閤 77
5.3 接口 79
5.3.1 將接口作為思考工具 79
5.3.2 單繼承和多繼承 80
5.4 優先考慮對象組閤而不是類繼承 80
5.4.1 避免父類命名含糊 81
5.4.2 避免繼承層次結構過深 81
5.5 小結 82
第6章 麵嚮對象原則 83
6.1 原則和模式 84
6.1.1 架構原則或模式 84
6.1.2 瞭解麵嚮對象原則 85
6.2 開放—封閉原則(OCP) 85
6.2.1 初識OCP 85
6.2.2 用類替換的情況 86
6.2.3 OCP在PHP中是如何相關的 88
6.3 單一職責原則(SRP) 88
6.3.1 混閤職責:模闆引擎 89
6.3.2 一個試驗:分離職責 91
6.3.3 實驗是否成功 93
6.4 依賴倒置原則(DIP) 94
6.4.1 什麼是依賴性 94
6.4.2 插入接口 96
6.5 分層設計 96
6.5.1 “三層”模式及其同屬 97
6.5.2 Web應用程序能否有域層 98
6.6 小結 99
第7章 設計模式 100
7.1 策略模式 101
7.1.1 使用策略模式的“Hello world” 101
7.1.2 策略模式的用處 103
7.2 適配器模式 104
7.2.1 初學適配器模式 104
7.2.2 讓一個模闆引擎與另一個相像 105
7.2.3 具有多個類的適配器模式 106
7.2.4 調整為通用接口 109
7.3 裝飾器模式 109
7.3.1 資源裝飾器 110
7.3.2 裝飾與再裝飾 111
7.4 空對象模式 113
7.4.1 混閤黑暗的燈和明亮的燈 114
7.4.2 空策略對象 114
7.5 迭代器模式 115
7.5.1 迭代器的工作原理 115
7.5.2 使用迭代器的好原因 116
7.5.3 迭代器與普通數組 116
7.5.4 SPL迭代器 117
7.5.5 SPL如何幫助我們解決迭代器和數組間的衝突 118
7.6 組閤模式 118
7.6.1 用組閤模式實現菜單 118
7.6.2 基本理論 120
7.6.3 連貫接口 121
7.6.4 遞歸處理 121
7.6.5 我們的方法低效嗎 123
7.7 小結 123
第8章 設計指南:日期和時間處理 124
8.1 為何日期和時間處理要麵嚮對象 124
8.1.1 更容易,但並非更簡單 125
8.1.2 麵嚮對象的優勢 125
8.2 找到正確的抽象 126
8.2.1 單個時間錶示法:時間點、Instant、DateAndTime 126
8.2.2 不同類彆的時間範圍:期間、持續時間、日期範圍、時間間隔 127
8.3 高級對象構建 128
8.3.1 使用創建方法 128
8.3.2 多個構造函數 129
8.3.3 使用工廠類 132
8.4 大型結構 133
8.4.1 包的概念 133
8.4.2 命名空間和包 134
8.4.3 PHP缺少命名空間支持 135
8.4.4 處理名稱衝突 135
8.5 使用值對象 140
8.5.1 對象引用帶來的麻煩 141
8.5.2 實現值對象 142
8.5.3 更改不可變的對象 142
8.6 實現基本類 143
8.6.1 DateAndTime 143
8.6.2 屬性和字段 144
8.6.3 期間 149
8.6.4 時間間隔 151
8.7 小結 151
第二部分 測試和重構
第9章 測試驅動開發 154
9.1 過程形成質量 155
9.1.1 本示例的需求 155
9.1.2 報告測試結果 156
9.2 從數據庫取數 157
9.2.1 基本測試 157
9.2.2 第一個真正的測試 158
9.2.3 通過測試 160
9.2.4 讓代碼運行 161
9.2.5 測試直到確信沒有問題 163
9.3 數據庫插入和更新 164
9.3.1 讓測試更易讀 165
9.3.2 紅,綠,重構 166
9.4 真正的數據庫事務處理 168
9.4.1 測試事務處理 168
9.4.2 實現事務處理 170
9.4.3 調試的終結 171
9.4.4 測試是工具,不是替代品 171
9.5 小結 172
第10章 高級測試技術 173
10.1 具有持久化功能的聯係人管理器 174
10.1.1 運行多個測試用例 174
10.1.2 測試聯係人的持久化 175
10.1.3 Contact和ContactFinder類 177
10.1.4 setUp()和tearDown() 178
10.1.5 最終版本 179
10.2 嚮聯係人發送郵件 180
10.2.1 設計Mailer類及其測試環境 180
10.2.2 手工編寫模擬對象 181
10.2.3 更為完善的模擬對象 182
10.2.4 自頂嚮下測試 183
10.2.5 模擬的局限性 184
10.3 虛擬的郵件服務器 185
10.3.1 安裝fakemail 186
10.3.2 郵件測試 187
10.3.3 網關作為適配器 190
10.4 小結 190
第11章 重構Web應用程序 192
11.1 真實世界中的重構 193
11.1.1 早期重構和後期重構 193
11.1.2 重構與重新實現 194
11.2 重構基礎:可讀性和重復性代碼 195
11.2.1 提高可讀性 195
11.2.2 消除重復性代碼 197
11.3 分離標記與程序代碼 199
11.3.1 分離何以有用 200
11.3.2 閤宜使用CSS 200
11.3.3 清理生成鏈接的函數 201
11.3.4 在SimpleTest中引入模闆 205
11.4 簡化條件錶達式 209
11.4.1 簡單示例 210
11.4.2 稍長的示例:身份驗證代碼 211
11.4.3 處理條件HTML 216
11.5 從麵嚮過程到麵嚮對象的重構 217
11.5.1 測試麵嚮過程代碼 217
11.5.2 進行重構 218
11.6 小結 221
第12章 用Web測試控製 222
12.1 再看聯係人管理器 223
12.1.1 樣闆 223
12.1.2 創建Web測試 225
12.1.3 用虛擬網頁交互通過測試 226
12.1.4 一次編寫,到處測試 227
12.2 可工作的錶單 229
12.2.1 嘗試將聯係人保存到數據庫中 230
12.2.2 創建數據庫 231
12.2.3 為查找器創建存根 232
12.3 質量保證 234
12.3.1 讓聯係人管理器可以進行單元測試 234
12.3.2 從用例到驗收測試 236
12.4 可怕的遺留代碼 238
12.5 小結 242
第三部分 構建Web界麵
第13章 使用模闆管理Web錶現層 244
13.1 分離錶現層和域邏輯 244
13.1.1 分離還是不分離…… 245
13.1.2 為什麼使用模闆 245
13.2 哪個模闆引擎 247
13.2.1 普通PHP 248
13.2.2 定製語法:Smarty 249
13.2.3 屬性語言:PHPTAL 251
13.3 轉換:XSLT 254
13.3.1 “XML化”網頁 255
13.3.2 設置XSLT 256
13.3.3 XSLT樣式錶 256
13.3.4 從PHP運行XSLT 258
13.4 將邏輯與模闆分離 259
13.4.1 視圖協助器 260
13.4.2 交替行顔色 260
13.4.3 處理日期和時間格式 261
13.4.4 生成層級顯示 263
13.4.5 防止從模闆更新 265
13.5 模闆和安全 266
13.5.1 PHPTAL 266
13.5.2 Smarty 267
13.5.3 XSLT 267
13.6 小結 267
第14章 構建復雜網頁 269
14.1 組閤模闆(復閤視圖) 269
14.1.1 復閤視圖:一個或多個設計模式 269
14.1.2 復閤數據和復閤模闆 270
14.2 實現直觀的復閤視圖 270
14.2.1 我們的目標 270
14.2.2 使用Smarty 272
14.2.3 使用PHPTAL 273
14.2.4 使用PHPTAL的頁麵宏 274
14.3 復閤視圖示例 275
14.3.1 製作打印友好的頁麵 276
14.3.2 將現有應用程序集成到復閤視圖中 277
14.3.3 多方顯示站點和Fowler的兩步視圖 278
14.4 小結 280
第15章 用戶交互 281
15.1 MVC體係結構 282
15.1.1 撥開MVC的迷霧 283
15.1.2 定義基本概念 284
15.1.3 命令還是操作 286
15.1.4 Web MVC不是富客戶MVC 286
15.2 Web命令模式 287
15.2.1 工作原理 288
15.2.2 命令標識符 288
15.2.3 Web處理程序 289
15.2.4 命令執行器 289
15.3 保持實現簡單 290
15.3.1 示例:“原生的”Web應用程序 290
15.3.2 引入命令函數 292
15.4 小結 294
第16章 控製器 296
16.1 控製器和請求對象 297
16.1.1 基本請求對象 297
16.1.2 安全問題 298
16.2 使用頁麵控製器 299
16.2.1 簡單示例 300
16.2.2 從頁麵控製器選擇視圖 301
16.2.3 讓命令可進行單元測試 302
16.2.4 避免HTML輸齣 303
16.2.5 使用模闆 303
16.2.6 重定嚮問題 304
16.3 構建前端控製器 307
16.3.1 一個命令一個類的Web處理程序 307
16.3.2 命令還需要些什麼 308
16.3.3 使用命令組 309
16.3.4 有多個提交按鈕的錶單 310
16.3.5 用JavaScript生成命令 311
16.3.6 用於復閤視圖的控製器 311
16.4 小結 312
第17章 輸入驗證 314
17.1 應用程序設計中的輸入驗證 315
17.1.1 驗證和應用程序體係結構 315
17.1.2 驗證策略 316
17.1.3 命名錶單組件 317
17.2 服務器端驗證及其問題 317
17.2.1 重復問題 318
17.2.2 樣式問題 318
17.2.3 測試和頁麵導航問題 319
17.2.4 我們能解決多少問題 319
17.3 客戶端驗證 320
17.3.1 普通的乏味的客戶端驗證 320
17.3.2 逐個驗證字段 321
17.3.3 你做不到這一點 323
17.3.4 錶單 326
17.4 麵嚮對象的服務器端驗證 327
17.4.1 規則和驗證程序 328
17.4.2 安全的請求對象體係結構 329
17.4.3 現在驗證非常簡單 333
17.4.4 讓其變得簡單的類 334
17.4.5 使用Specification對象 336
17.4.6 知識豐富的設計 339
17.4.7 嚮外觀添加驗證 340
17.5 同步服務器端和客戶端驗證 341
17.5.1 錶單生成器 342
17.5.2 配置文件 342
17.5.3 從客戶端驗證生成服務器端驗證 343
17.6 小結 343
第18章 錶單處理 345
18.1 用HTML_QuickForm設計解決方案 345
18.1.1 最小需求和設計 346
18.1.2 將生成的元素放到HTML錶單中 346
18.1.3 找到抽象 347
18.1.4 更為具體的需求 348
18.1.5 選擇問題 349
18.2 實現解決方案 350
18.2.1 包裝HTML_QuickForm元素 350
18.2.2 輸入控件 351
18.2.3 哪個類創建錶單控件 354
18.2.4 驗證 355
18.2.5 在模闆中使用錶單對象 357
18.2.6 下一步做什麼 359
18.3 小結 359
第19章 數據庫連接、抽象和配置 361
19.1 數據庫抽象 362
19.1.1 預處理語句 362
19.1.2 麵嚮對象的數據庫查詢 364
19.2 裝飾和適配數據庫資源對象 366
19.2.1 簡單的可配置數據庫連接 366
19.2.2 從結果集製作與SPL兼容的迭代器 367
19.3 讓數據庫連接可用 369
19.3.1 單例和類似模式 370
19.3.2 服務定位器和注冊錶 371
19.4 小結 373
第四部分 數據庫和基礎結構
第20章 對象和SQL 376
20.1 對象-關係阻抗不匹配 376
20.2 封裝和隱藏SQL 378
20.2.1 基本示例 378
20.2.2 在SQL語句中替換字符串 379
20.3 通用化SQL 383
20.3.1 列的列錶和錶名 383
20.3.2 使用SQL彆名 386
20.3.3 生成INSERT、UPDATE和DELETE語句 386
20.3.4 查詢對象 390
20.3.5 適用的設計模式 391
20.4 小結 391
第21章 數據類設計 392
21.1 最簡單的方法 392
21.1.1 用Finder類檢索數據 393
21.1.2 主要程序:錶數據網關 395
21.2 讓對象自身持久化 400
21.2.1 自我持久化的查找器 401
21.2.2 讓對象存儲自己 405
21.3 數據映射器模式 406
21.3.1 數據映射器和DAO 406
21.3.2 這些模式無甚差彆 408
21.3.3 模式小結 409
21.4 實際使用效果 409
21.4.1 模式在典型Web應用程序中的效果 410
21.4.2 優化查詢 411
21.5 小結 411
附錄A 測試工具和小技巧 412
附錄B 安全 420
參考文獻 429
· · · · · · (
收起)