內容簡介
《PHP實戰》內容簡介:隨著 PHP 5的發布和 Zend
框架項目的套用,PHP和敏捷思想、設計模式以及單元測試的聯姻成為主流話題。《PHP實戰》首先介紹了
面向對象設計的原則、模式和技巧,然後講述了如何在 PHP上利用其
語法和特性,處理和實施這些原則、模式和技巧,並套用於Web編程中遇到的難題上。《PHP實戰》適合所有使用 PHP開發 Web應用程式的人員閱讀。
PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法。它可以比 CGI或者Perl更快速的執行動態網頁。用PHP做出的動態頁面與其他的程式語言相比,PHP是將程式嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和最佳化代碼運行,使代碼運行更快。PHP具有非常強大的功能,所有的CGI的功能PHP都能實現,而且支持幾乎所有流行的資料庫以及作業系統。最重要的是PHP可以用C、C++進行程式的擴展!
編輯推薦
《PHP實戰》:近幾年,PHP的發展
突飛猛進,業已超越Java和ASP。成為目前最流行的Web開發語言。而隨著PHP 5的發布和Zend框架的套用,PHP和敏捷思想、設計模式以及單元測試的聯姻成為主流話題。
《PHP實戰》首先介紹了面向對象設計的原則、模式和技巧,然後講述了如何運用PHP的語法和特性來解決Web編程中遇到的難題。涵蓋了
單元測試、重構、用戶互動、
MVC模式、輸入驗證、表單處理、資料庫連線和查詢。以及抽象的持久性對象等內容。通過研讀《PHP實戰》,讀者將對
PHP有更深層、更透徹的理解。可以借鑑先進的面向對象實踐。極大地提升自己面向對象設計和
編程的能力。
理論和實踐的完美結合
Web開發人員必讀之作
大量PHP核心技巧和最佳實踐
媒體推薦
“對於那些想要在PHP方面更進一步的開發者而言,此書必不可少。”
——Gabriel Malkas.Developpez-com
“簡而言之,這是我所讀過的關於面向對象編程和PHP最好的圖書。……強烈推薦此書。絕不要錯過!”
——Amazon評論
“此書是理論與實踐的完美融合,到目前為止,其他任何圖書都無法與它相媲美。如果5顆星是滿分,它全值得10顆星!”
——Amazon評論
作者簡介
作者:(挪威)雷勒索(Dagfinn Reiersφl) (英國)貝克(Marcus Baker) (美國)史夫利特(Chris Shiflett) 譯者:張穎等 合著者:段大為
雷勒索(Dagfinn Reiersφl),資深軟體專家。有10多年的從業經驗,設計並開發了Web應用程式、Web內容挖掘軟體、Web編程工具以及文本分析程式。其中絕大多數都是運用PHP編寫的。他居住在挪威奧斯陸。
貝克(Marcus Baker),資深軟體專家。多年來一直從事面向對象設計和開發以及Web程式開發和測試方面的工作。他同時也是PHP Architectecture Magazine的專欄作家。
史夫利特(Chris Shiflett),PHP軟體專家、安全專家以及PHP社區的領軍人物。他是PHP安全協會的奠基者,著有HTTPDeveloper,S Handbook和Essential PHP Security兩本圖書。
目錄
第一部分 工具和概念
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.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.1 將繼承作為思考工具 72
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