第一部分 对象 2
第1章 PHP:设计和管理 2
1.1问题 2
1.2PHP与其他语言 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.1PHP对象的偶然成功 9
2.1.1起源:PHP/FI 9
2.1.2语法糖:PHP3 9
2.1.3一场静悄悄的革命:PHP4 10
2.1.4拥抱变化:PHP5 11
2.1.5迎头追赶:PHP7 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.3public、private和protected:管理类的访问 38
3.6小结 43
第4章 高级特性 44
4.1静态方法和属性 44
4.2常量属性 47
4.3抽象类 48
4.4接口 50
4.5trait 52
4.5.1trait可以解决的问题 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.8final类和方法 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.1PHP和包 93
5.1.1PHP包和命名空间 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.8UML 134
6.8.1类图 135
6.8.2序列图 140
6.9小结 142
第二部分 模式 144
第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.5PHP与设计模式 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
第三部分 实践 346
第14章 优秀(以及糟糕)的实践 346
14.1超越代码 346
14.2借轮子 347
14.3合作愉快 348
14.4为代码插上翅膀 349
14.5标准 350
14.6Vagrant 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.1PSR-1基础编码规范 356
15.3.2PSR-2编码风格规范 358
15.3.3检查和修改代码 360
15.4PSR-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.3require-dev元素 369
16.4Composer与自动加载 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.6mock和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.1Phing是什么 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