基本信息·出版社:人民邮电出版社 ·页码:428 页 ·出版日期:2010年01月 ·ISBN:9787115217455 ·条形码:9787115217455 ·版本:第1版 ·装帧:平装 ...
商家名称 |
信用等级 |
购买信息 |
订购本书 |
|
 |
PHP实战 |
 |
|
 |
PHP实战 |
 |

基本信息·出版社:人民邮电出版社
·页码:428 页
·出版日期:2010年01月
·ISBN:9787115217455
·条形码:9787115217455
·版本:第1版
·装帧:平装
·开本:16
·正文语种:中文
·丛书名:图灵程序设计丛书·Web开发系列
·外文书名:PHP in Action Object,Design,Agility
内容简介 《PHP实战》内容简介:随着 PHP 5的发布和 Zend框架项目的应用,PHP和敏捷思想、设计模式以及单元测试的联姻成为主流话题。《PHP实战》首先介绍了面向对象设计的原则、模式和技巧,然后讲述了如何在 PHP上利用其语法和特性,处理和实施这些原则、模式和技巧,并应用于 Web编程中遇到的难题上。《PHP实战》适合所有使用 PHP开发 Web应用程序的人员阅读。
作者简介 雷勒索(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两本图书。
媒体推荐 “对于那些想要在PHP方面更进一步的开发者而言,此书必不可少。”
——Gabriel Malkas.Developpez.com
“简而言之,这是我所读过的关于面向对象编程和PHP最好的图书。……强烈推荐此书。绝不要错过!”
——Amazon评论
“此书是理论与实践的完美融合,到目前为止,其他任何图书都无法与它相媲美。如果5颗星是满分,它全值得10颗星!”
——Amazon评论
编辑推荐 《PHP实战》:近几年,PHP的发展突飞猛进,业已超越Java和ASP。成为目前最流行的Web开发语言。而随着PHP 5的发布和Zend框架的应用,PHP和敏捷思想、设计模式以及单元测试的联姻成为主流话题。
《PHP实战》首先介绍了面向对象设计的原则、模式和技巧,然后讲述了如何运用PHP的语法和特性来解决Web编程中遇到的难题。涵盖了单元测试、重构、用户交互、MVC模式、输入验证、表单处理、数据库连接和查询。以及抽象的持久性对象等内容。通过研读《PHP实战》,读者将对PHP有更深层、更透彻的理解。可以借鉴先进的面向对象实践。极大地提升自己面向对象设计和编程的能力。
理论和实践的完美结合
Web开发人员必读之作
大量PHP核心技巧和最佳实践
目录 第一部分 工具和概念
第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
……
序言 这本书的背后有我个人的一段故事。几年前,我意识到自己职业生涯中的一切努力和我的预期并不十分相符。虽然还没有严重到中年危机的地步,但这种意识促使我开始以新的方式来思考。
那时我正从事PHP的Web编程。在我所供职的公司里,我处于一种孤独的境地。于是我决定仔细审视一下自己的工作。我扪心自问:“如何才能让自己有更卓越的表现?”一个想法就是,每天结束的时候都对当天的工作做出总结。我做的最成功的是什么?怎样才能取得更多成功?什么是不太成功的?如何才能减少不成功的事?
木桶的短板就是调试。很明显,它占用了我绝大多数的时间,如果有什么可以使调试更有效或者根本可以不要调试,那么我的工作会更高效。我开始尝试更早地捕捉bug。我试过防御型编程,但不是很成功。不久我偶然发现了敏捷过程和测试驱动开发、极限编程和重构。这些方法粗看上去像我和我的同事们这些年来一直的做法,但确实要好不少。我首先在自己的工作中运用了这套方法。当时,PHP社区中鲜有人做此尝试。我是比较早这样做的,我使用了2002年3月的PHPUnit最初的测试版实践测试先行。
有这本书的构想,是在我接手了一位程序员同行一些拙劣的PHP代码之后。我意识到代码可以改进、重构,并且可以系统地阐述它。我想这对于有些人一定是有用的。并且,PHP领域尚没有关于敏捷过程和测试驱动开发的图书。
一件事情意外地加速了这个写书的项目:我被解雇了。(几个月后,我成了那间解雇我的公司的董事会成员,这是另一个故事。)我花了将近三年的时间完成本书。要让审阅者对它十分满意不是件易事,很多部分我都重写了好几次。MarcusBaker和ChrisShiflett在将近结尾处参与了进来。同时,PHP和敏捷思想、设计模式和单元测试的联姻成为本书的主流话题。这个过程中最重要的官方事件是PHP5的发布和Zend框架项目的启动。
整个过程当中我学到很多东西,最重要的是,如果想自己写一本书,那就一定要多读书。我相信深层理解的重要性,不只是知道很多的细节,而是对每个细节都有深入的理解。我也相信,这来源于扎实的基础和从多方面理解问题的能力。
这一切都引领我不断重新审视那些最基本的问题。我不断地问一些看起来有些傻的问题。在网络论坛中,即使是在讨论我非常熟悉的问题时,我也经常被误认为是初学者。我相信,我自己的理解越深,我就能为别人把这个问题解释得更好。我希望这种探索对你们来说也是有帮助的。
文摘 插图: