Preface |
|
xiii | |
Part I. Language Features |
|
|
|
1 | (4) |
|
|
1 | (1) |
|
|
2 | (1) |
|
|
3 | (2) |
|
|
5 | (32) |
|
|
5 | (8) |
|
|
7 | (1) |
|
|
8 | (1) |
|
|
9 | (2) |
|
|
11 | (2) |
|
|
13 | (4) |
|
|
17 | (5) |
|
|
18 | (1) |
|
|
19 | (2) |
|
|
21 | (1) |
|
|
22 | (3) |
|
|
22 | (1) |
|
|
23 | (2) |
|
|
25 | (4) |
|
|
25 | (2) |
|
|
27 | (2) |
|
|
29 | (3) |
|
|
29 | (2) |
|
|
31 | (1) |
|
|
31 | (1) |
|
|
32 | (2) |
|
|
32 | (1) |
|
|
33 | (1) |
|
|
33 | (1) |
|
Detect the Built-in Server |
|
|
34 | (1) |
|
|
34 | (1) |
|
|
34 | (3) |
Part II. Good Practices |
|
|
|
37 | (14) |
|
|
38 | (1) |
|
Framework Interoperability |
|
|
38 | (2) |
|
|
39 | (1) |
|
|
39 | (1) |
|
|
39 | (1) |
|
|
40 | (1) |
|
|
40 | (1) |
|
|
41 | (4) |
|
|
45 | (3) |
|
|
46 | (1) |
|
|
47 | (1) |
|
|
48 | (3) |
|
Why Autoloaders Are Important |
|
|
48 | (1) |
|
The PSR-4 Autoloader Strategy |
|
|
49 | (1) |
|
How to Write a PSR-4 Autoloader (and Why You Shouldn't) |
|
|
49 | (2) |
|
|
51 | (24) |
|
|
51 | (1) |
|
|
52 | (1) |
|
Components Versus Frameworks |
|
|
53 | (2) |
|
Not All Frameworks Are Bad |
|
|
54 | (1) |
|
Use the Right Tool for the Job |
|
|
55 | (1) |
|
|
55 | (2) |
|
|
56 | (1) |
|
|
56 | (1) |
|
|
57 | (1) |
|
|
57 | (9) |
|
|
58 | (1) |
|
|
59 | (2) |
|
|
61 | (3) |
|
Composer and Private Repositories |
|
|
64 | (2) |
|
|
66 | (9) |
|
|
66 | (1) |
|
|
66 | (1) |
|
|
67 | (1) |
|
|
68 | (2) |
|
|
70 | (1) |
|
|
71 | (1) |
|
|
72 | (1) |
|
|
73 | (1) |
|
|
74 | (1) |
|
|
75 | (54) |
|
Sanitize, Validate, and Escape |
|
|
75 | (5) |
|
|
76 | (3) |
|
|
79 | (1) |
|
|
80 | (1) |
|
|
80 | (7) |
|
Never Know User Passwords |
|
|
81 | (1) |
|
Never Restrict User Passwords |
|
|
81 | (1) |
|
Never Email User Passwords |
|
|
81 | (1) |
|
Hash User Passwords with bcrypt |
|
|
82 | (1) |
|
|
82 | (5) |
|
Password Hashing API for PHP < 5.5.0 |
|
|
87 | (1) |
|
Dates, Times, and Time Zones |
|
|
87 | (6) |
|
|
88 | (1) |
|
|
88 | (1) |
|
|
89 | (2) |
|
|
91 | (1) |
|
|
92 | (1) |
|
The nesbot/carbon Component |
|
|
93 | (1) |
|
|
93 | (10) |
|
|
93 | (1) |
|
Database Connections and DSNs |
|
|
93 | (3) |
|
|
96 | (2) |
|
|
98 | (2) |
|
|
100 | (3) |
|
|
103 | (3) |
|
|
104 | (1) |
|
|
105 | (1) |
|
|
106 | (13) |
|
|
106 | (3) |
|
|
109 | (1) |
|
|
110 | (2) |
|
|
112 | (3) |
|
|
115 | (1) |
|
|
115 | (3) |
|
|
118 | (1) |
|
|
119 | (10) |
|
|
121 | (2) |
|
Errors and Exceptions During Development |
|
|
123 | (1) |
|
|
124 | (5) |
Part III. Deployment, Testing, and Tuning |
|
|
|
129 | (4) |
|
|
129 | (1) |
|
|
130 | (1) |
|
|
131 | (1) |
|
|
131 | (1) |
|
|
132 | (1) |
|
|
133 | (16) |
|
|
134 | (1) |
|
|
134 | (4) |
|
|
134 | (1) |
|
|
135 | (1) |
|
|
135 | (1) |
|
SSH Key-Pair Authentication |
|
|
136 | (2) |
|
Disable Passwords and Root Login |
|
|
138 | (1) |
|
|
138 | (5) |
|
|
139 | (1) |
|
|
139 | (1) |
|
|
140 | (3) |
|
|
143 | (3) |
|
|
143 | (1) |
|
|
143 | (3) |
|
Automate Server Provisioning |
|
|
146 | (1) |
|
Delegate Server Provisioning |
|
|
146 | (1) |
|
|
147 | (1) |
|
|
147 | (2) |
|
|
149 | (8) |
|
|
149 | (1) |
|
|
150 | (1) |
|
|
151 | (1) |
|
|
152 | (1) |
|
|
153 | (1) |
|
|
154 | (1) |
|
|
155 | (1) |
|
|
155 | (1) |
|
|
155 | (2) |
|
|
157 | (8) |
|
|
157 | (1) |
|
|
157 | (1) |
|
|
158 | (1) |
|
|
158 | (1) |
|
|
158 | (1) |
|
|
158 | (5) |
|
|
158 | (1) |
|
|
159 | (1) |
|
|
159 | (2) |
|
|
161 | (1) |
|
Prepare the Remote Server |
|
|
161 | (1) |
|
|
162 | (1) |
|
|
163 | (1) |
|
Roll Back Your Application |
|
|
163 | (1) |
|
|
163 | (1) |
|
|
163 | (2) |
|
|
165 | (16) |
|
|
165 | (1) |
|
|
166 | (1) |
|
|
166 | (1) |
|
|
166 | (1) |
|
|
166 | (1) |
|
|
166 | (1) |
|
|
167 | (1) |
|
|
167 | (1) |
|
Test-Driven Development (TDD) |
|
|
167 | (1) |
|
Behavior-Driven Development (BDD) |
|
|
167 | (1) |
|
|
168 | (9) |
|
|
169 | (1) |
|
|
170 | (1) |
|
|
170 | (1) |
|
|
171 | (1) |
|
|
172 | (1) |
|
The WhovianTest Test Case |
|
|
173 | (2) |
|
|
175 | (1) |
|
|
176 | (1) |
|
Continuous Testing with Travis CI |
|
|
177 | (1) |
|
|
177 | (1) |
|
|
178 | (1) |
|
|
178 | (1) |
|
|
179 | (2) |
|
|
181 | (6) |
|
|
181 | (1) |
|
|
181 | (1) |
|
|
182 | (2) |
|
|
182 | (1) |
|
|
183 | (1) |
|
|
183 | (1) |
|
|
184 | (2) |
|
|
184 | (1) |
|
|
184 | (1) |
|
|
185 | (1) |
|
|
185 | (1) |
|
|
186 | (1) |
|
|
186 | (1) |
|
|
186 | (1) |
|
|
186 | (1) |
|
|
187 | (18) |
|
|
187 | (8) |
|
|
188 | (1) |
|
HHVM and Zend Engine Parity |
|
|
189 | (1) |
|
|
190 | (1) |
|
|
190 | (1) |
|
|
191 | (1) |
|
|
192 | (1) |
|
Monitor HHVM with Supervisord |
|
|
192 | (2) |
|
|
194 | (1) |
|
|
195 | (10) |
|
|
196 | (1) |
|
|
196 | (2) |
|
|
198 | (1) |
|
|
198 | (1) |
|
|
199 | (1) |
|
|
199 | (1) |
|
|
200 | (1) |
|
|
200 | (2) |
|
|
202 | (1) |
|
|
203 | (1) |
|
|
204 | (1) |
|
|
205 | (4) |
|
|
205 | (1) |
|
|
205 | (1) |
|
|
206 | (1) |
|
|
206 | (3) |
|
|
206 | (1) |
|
|
206 | (1) |
|
|
206 | (1) |
|
|
206 | (1) |
|
|
207 | (2) |
A Installing PHP |
|
209 | (20) |
B Local Development Environments |
|
229 | (8) |
Index |
|
237 | |