Cover....1
Copyright....3
Table of Contents....6
Preface....12
Who This Book Is For....13
Navigating This Book....13
Conventions Used in This Book....14
Programming Conventions....14
Typographical Conventions....14
O’Reilly Online Learning....15
How to Contact Us....15
Acknowledgments....16
Chapter 1. Variables....18
1.1 Defining Constants....20
Problem....20
Solution....20
Discussion....20
See Also....21
1.2 Creating Variable Variables....21
Problem....21
Solution....21
Discussion....22
See Also....23
1.3 Swapping Variables in Place....24
Problem....24
Solution....24
Discussion....24
See Also....26
Chapter 2. Operators....28
2.1 Using a Ternary Operator Instead of an If-Else Block....32
Problem....32
Solution....32
Discussion....32
See Also....34
2.2 Coalescing Potentially Null Values....34
Problem....34
Solution....34
Discussion....34
See Also....35
2.3 Comparing Identical Values....35
Problem....35
Solution....35
Discussion....35
See Also....37
2.4 Using the Spaceship Operator to Sort Values....37
Problem....37
Solution....38
Discussion....39
See Also....39
2.5 Suppressing Diagnostic Errors with an Operator....40
Problem....40
Solution....40
Discussion....40
See Also....41
2.6 Comparing Bits Within Integers....41
Problem....41
Solution....41
Discussion....41
See Also....44
Chapter 3. Functions....46
3.1 Accessing Function Parameters....48
Problem....48
Solution....48
Discussion....49
See Also....50
3.2 Setting a Function’s Default Parameters....50
Problem....50
Solution....50
Discussion....51
See Also....52
3.3 Using Named Function Parameters....52
Problem....52
Solution....52
Discussion....52
See Also....53
3.4 Enforcing Function Argument and Return Typing....54
Problem....54
Solution....54
Discussion....54
See Also....57
3.5 Defining a Function with a Variable Number of Arguments....57
Problem....57
Solution....57
Discussion....57
See Also....58
3.6 Returning More Than One Value....59
Problem....59
Solution....59
Discussion....59
See Also....60
3.7 Accessing Global Variables from Within a Function....61
Problem....61
Solution....61
Discussion....61
See Also....64
3.8 Managing State Within a Function Across Multiple Invocations....64
Problem....64
Solution....64
Discussion....65
See Also....67
3.9 Defining Dynamic Functions....67
Problem....67
Solution....67
Discussion....67
See Also....68
3.10 Passing Functions as Parameters to Other Functions....68
Problem....68
Solution....68
Discussion....69
See Also....71
3.11 Using Concise Function Definitions (Arrow Functions)....71
Problem....71
Solution....71
Discussion....71
See Also....73
3.12 Creating a Function with No Return Value....73
Problem....73
Solution....73
Discussion....74
See Also....75
3.13 Creating a Function That Does Not Return....75
Problem....75
Solution....75
Discussion....75
See Also....76
Chapter 4. Strings....78
4.1 Accessing Substrings Within a Larger String....81
Problem....81
Solution....81
Discussion....81
See Also....82
4.2 Extracting One String from Within Another....82
Problem....82
Solution....83
Discussion....83
See Also....84
4.3 Replacing Part of a String....84
Problem....84
Solution....84
Discussion....85
See Also....87
4.4 Processing a String One Byte at a Time....87
Problem....87
Solution....87
Discussion....88
See Also....89
4.5 Generating Random Strings....89
Problem....89
Solution....89
Discussion....90
See Also....90
4.6 Interpolating Variables Within a String....90
Problem....90
Solution....91
Discussion....91
See Also....92
4.7 Concatenating Multiple Strings Together....92
Problem....92
Solution....92
Discussion....92
See Also....94
4.8 Managing Binary Data Stored in Strings....94
Problem....94
Solution....95
Discussion....95
See Also....97
Chapter 5. Numbers....98
5.1 Validating a Number Within a Variable....99
Problem....99
Solution....99
Discussion....100
See Also....101
5.2 Comparing Floating-Point Numbers....101
Problem....101
Solution....101
Discussion....101
See Also....103
5.3 Rounding Floating-Point Numbers....103
Problem....103
Solution....103
Discussion....103
See Also....104
5.4 Generating Truly Random Numbers....105
Problem....105
Solution....105
Discussion....105
See Also....106
5.5 Generating Predictable Random Numbers....106
Problem....106
Solution....106
Discussion....107
See Also....108
5.6 Generating Weighted Random Numbers....108
Problem....108
Solution....108
Discussion....109
See Also....111
5.7 Calculating Logarithms....111
Problem....111
Solution....111
Discussion....111
See Also....111
5.8 Calculating Exponents....111
Problem....111
Solution....112
Discussion....112
See Also....112
5.9 Formatting Numbers as Strings....113
Problem....113
Solution....113
Discussion....113
See Also....114
5.10 Handling Very Large or Very Small Numbers....114
Problem....114
Solution....114
Discussion....114
See Also....116
5.11 Converting Numbers Between Numerical Bases....116
Problem....116
Solution....116
Discussion....116
See Also....117
Chapter 6. Dates and Times....118
6.1 Finding the Current Date and Time....119
Problem....119
Solution....119
Discussion....120
See Also....121
6.2 Formatting Dates and Times....121
Problem....121
Solution....121
Discussion....122
See Also....124
6.3 Converting Dates and Times to Unix Timestamps....124
Problem....124
Solution....124
Discussion....124
See Also....125
6.4 Converting from Unix Timestamps to Date and Time Parts....126
Problem....126
Solution....126
Discussion....126
See Also....127
6.5 Computing the Difference Between Two Dates....127
Problem....127
Solution....127
Discussion....127
See Also....128
6.6 Parsing Dates and Times from Arbitrary Strings....128
Problem....128
Solution....129
Discussion....129
See Also....131
6.7 Validating a Date....131
Problem....131
Solution....132
Discussion....132
See Also....132
6.8 Adding to or Subtracting from a Date....132
Problem....132
Solution....132
Discussion....133
See Also....136
6.9 Calculating Times Across Time Zones....136
Problem....136
Solution....136
Discussion....136
See Also....138
Chapter 7. Arrays....140
7.1 Associating Multiple Elements per Key in an Array....142
Problem....142
Solution....142
Discussion....142
See Also....144
7.2 Initializing an Array with a Range of Numbers....144
Problem....144
Solution....144
Discussion....145
See Also....146
7.3 Iterating Through Items in an Array....146
Problem....146
Solution....146
Discussion....146
See Also....148
7.4 Deleting Elements from Associative and Numeric Arrays....148
Problem....148
Solution....148
Discussion....149
See Also....151
7.5 Changing the Size of an Array....152
Problem....152
Solution....152
Discussion....152
See Also....154
7.6 Appending One Array to Another....154
Problem....154
Solution....154
Discussion....155
See Also....157
7.7 Creating an Array from a Fragment of an Existing Array....157
Problem....157
Solution....157
Discussion....157
See Also....160
7.8 Converting Between Arrays and Strings....160
Problem....160
Solution....160
Discussion....160
See Also....162
7.9 Reversing an Array....163
Problem....163
Solution....163
Discussion....163
See Also....164
7.10 Sorting an Array....164
Problem....164
Solution....164
Discussion....164
See Also....166
7.11 Sorting an Array Based on a Function....167
Problem....167
Solution....167
Discussion....167
See Also....169
7.12 Randomizing the Elements in an Array....169
Problem....169
Solution....169
Discussion....169
See Also....169
7.13 Applying a Function to Every Element of an Array....170
Problem....170
Solution....170
Discussion....170
See Also....173
7.14 Reducing an Array to a Single Value....173
Problem....173
Solution....173
Discussion....173
See Also....174
7.15 Iterating over Infinite or Very Large/Expensive Arrays....174
Problem....174
Solution....175
Discussion....175
See Also....176
Chapter 8. Classes and Objects....178
8.1 Instantiating Objects from Custom Classes....185
Problem....185
Solution....185
Discussion....186
See Also....187
8.2 Constructing Objects to Define Defaults....187
Problem....187
Solution....187
Discussion....188
See Also....189
8.3 Defining Read-Only Properties in a Class....189
Problem....189
Solution....189
Discussion....189
See Also....191
8.4 Deconstructing Objects to Clean Up After the Object Is No Longer Needed....192
Problem....192
Solution....192
Discussion....192
See Also....194
8.5 Using Magic Methods to Provide Dynamic Properties....194
Problem....194
Solution....194
Discussion....195
See Also....196
8.6 Extending Classes to Define Additional Functionality....196
Problem....196
Solution....196
Discussion....197
See Also....198
8.7 Forcing Classes to Exhibit Specific Behavior....198
Problem....198
Solution....199
Discussion....199
See Also....202
8.8 Creating Abstract Base Classes....203
Problem....203
Solution....203
Discussion....203
See Also....205
8.9 Preventing Changes to Classes and Methods....205
Problem....205
Solution....205
Discussion....205
See Also....209
8.10 Cloning Objects....209
Problem....209
Solution....209
Discussion....210
See Also....213
8.11 Defining Static Properties and Methods....213
Problem....213
Solution....213
Discussion....214
See Also....216
8.12 Introspecting Private Properties or Methods Within an Object....216
Problem....216
Solution....216
Discussion....216
See Also....218
8.13 Reusing Arbitrary Code Between Classes....218
Problem....218
Solution....218
Discussion....219
See Also....221
Chapter 9. Security and Encryption....222
9.1 Filtering, Validating, and Sanitizing User Input....229
Problem....229
Solution....229
Discussion....229
See Also....233
9.2 Keeping Sensitive Credentials Out of Application Code....233
Problem....233
Solution....233
Discussion....234
See Also....235
9.3 Hashing and Validating Passwords....235
Problem....235
Solution....235
Discussion....236
See Also....238
9.4 Encrypting and Decrypting Data....238
Problem....238
Solution....238
Discussion....240
See Also....244
9.5 Storing Encrypted Data in a File....244
Problem....244
Solution....244
Discussion....247
See Also....248
9.6 Cryptographically Signing a Message to Be Sent to Another Application....248
Problem....248
Solution....248
Discussion....249
See Also....250
9.7 Verifying a Cryptographic Signature....250
Problem....250
Solution....250
Discussion....251
See Also....251
Chapter 10. File Handling....252
10.1 Creating or Opening a Local File....253
Problem....253
Solution....253
Discussion....253
See Also....255
10.2 Reading a File into a String....255
Problem....255
Solution....255
Discussion....255
See Also....256
10.3 Reading a Specific Slice of a File....256
Problem....256
Solution....256
Discussion....257
See Also....257
10.4 Modifying a File in Place....258
Problem....258
Solution....258
Discussion....258
See Also....258
10.5 Writing to Many Files Simultaneously....259
Problem....259
Solution....259
Discussion....259
See Also....261
10.6 Locking a File to Prevent Access or Modification by Another Process....261
Problem....261
Solution....261
Discussion....261
See Also....262
Chapter 11. Streams....264
11.1 Streaming Data to/from a Temporary File....268
Problem....268
Solution....268
Discussion....269
See Also....270
11.2 Reading from the PHP Input Stream....270
Problem....270
Solution....270
Discussion....271
See Also....273
11.3 Writing to the PHP Output Stream....273
Problem....273
Solution....273
Discussion....274
See Also....275
11.4 Reading from One Stream and Writing to Another....275
Problem....275
Solution....275
Discussion....276
See Also....277
11.5 Composing Different Stream Handlers Together....277
Problem....277
Solution....278
Discussion....278
See Also....281
11.6 Writing a Custom Stream Wrapper....281
Problem....281
Solution....281
Discussion....282
See Also....284
Chapter 12. Error Handling....286
12.1 Finding and Fixing Parse Errors....286
Problem....286
Solution....286
Discussion....287
See Also....288
12.2 Creating and Handling Custom Exceptions....288
Problem....288
Solution....288
Discussion....288
See Also....290
12.3 Hiding Error Messages from End Users....290
Problem....290
Solution....290
Discussion....291
See Also....293
12.4 Using a Custom Error Handler....293
Problem....293
Solution....293
Discussion....293
See Also....294
12.5 Logging Errors to an External Stream....294
Problem....294
Solution....294
Discussion....295
See Also....295
Chapter 13. Debugging and Testing....296
13.1 Using a Debugger Extension....298
Problem....298
Solution....298
Discussion....298
See Also....300
13.2 Writing a Unit Test....300
Problem....300
Solution....300
Discussion....301
See Also....305
13.3 Automating Unit Tests....305
Problem....305
Solution....305
Discussion....306
See Also....307
13.4 Using Static Code Analysis....308
Problem....308
Solution....308
Discussion....308
See Also....309
13.5 Logging Debugging Information....309
Problem....309
Solution....309
Discussion....310
See Also....313
13.6 Dumping Variable Contents as Strings....313
Problem....313
Solution....313
Discussion....314
See Also....316
13.7 Using the Built-in Web Server to Quickly Run an Application....316
Problem....316
Solution....317
Discussion....317
See Also....318
13.8 Using Unit Tests to Detect Regressions in a Version-Controlled Project with git-bisect....318
Problem....318
Solution....318
Discussion....319
See Also....322
Chapter 14. Performance Tuning....324
14.1 Timing Function Execution....327
Problem....327
Solution....327
Discussion....327
See Also....331
14.2 Benchmarking the Performance of an Application....331
Problem....331
Solution....331
Discussion....333
See Also....337
14.3 Accelerating an Application with an Opcode Cache....337
Problem....337
Solution....338
Discussion....338
See Also....340
Chapter 15. Packages and Extensions....342
15.1 Defining a Composer Project....344
Problem....344
Solution....344
Discussion....345
See Also....347
15.2 Finding Composer Packages....347
Problem....347
Solution....347
Discussion....347
See Also....349
15.3 Installing and Updating Composer Packages....349
Problem....349
Solution....349
Discussion....349
See Also....352
15.4 Installing Native PHP Extensions....352
Problem....352
Solution....352
Discussion....353
See Also....354
Chapter 16. Databases....356
16.1 Relational Databases....356
16.2 Key-Value Stores....357
16.3 Graph Databases....358
16.4 Document Databases....359
16.5 Connecting to an SQLite Database....359
Problem....359
Solution....359
Discussion....360
See Also....361
16.6 Using PDO to Connect to an External Database Provider....361
Problem....361
Solution....361
Discussion....363
See Also....366
16.7 Sanitizing User Input for a Database Query....366
Problem....366
Solution....366
Discussion....366
See Also....368
16.8 Mocking Data for Integration Testing with a Database....368
Problem....368
Solution....369
Discussion....370
See Also....373
16.9 Querying an SQL Database with the Eloquent ORM....373
Problem....373
Solution....373
Discussion....374
See Also....376
Chapter 17. Asynchronous PHP....378
17.1 Fetching Data from Remote APIs Asynchronously....384
Problem....384
Solution....384
Discussion....384
See Also....386
17.2 Waiting on the Results of Multiple Asynchronous Operations....386
Problem....386
Solution....386
Discussion....387
See Also....388
17.3 Interrupting One Operation to Run Another....388
Problem....388
Solution....388
Discussion....389
See Also....391
17.4 Running Code in a Separate Thread....391
Problem....391
Solution....391
Discussion....393
See Also....396
17.5 Sending and Receiving Messages Between Separate Threads....396
Problem....396
Solution....396
Discussion....399
See Also....400
17.6 Using a Fiber to Manage the Contents from a Stream....400
Problem....400
Solution....400
Discussion....402
See Also....404
Chapter 18. PHP Command Line....406
18.1 Parsing Program Arguments....407
Problem....407
Solution....407
Discussion....407
See Also....410
18.2 Reading Interactive User Input....410
Problem....410
Solution....410
Discussion....411
See Also....412
18.3 Colorizing Console Output....412
Problem....412
Solution....412
Discussion....412
See Also....413
18.4 Creating a Command-Line Application with Symfony Console....413
Problem....413
Solution....413
Discussion....414
See Also....416
18.5 Using PHP’s Native Read-Eval-Print-Loop....417
Problem....417
Solution....417
Discussion....417
See Also....419
Index....420
About the Author....432
If you're a PHP developer looking for proven solutions to common problems, this cookbook provides code recipes to help you resolve a variety of coding issues. PHP is a remarkably easy language to work with, which explains why it powers more than 75% of the websites online today. It's also incredibly forgiving of programming mistakes, which can perpetuate reuse of questionable code.
By leveraging modern versions of PHP through version 8.2, author Eric Mann provides self-contained recipes that will enable you to solve the problems you face in your day-to-day work. You'll also find established patterns and examples that any developer can follow for addressing common problems with PHP. With these recipes, you'll quickly identify and resolve complicated issues without having to reinvent the wheel.