Copyright
Table of Contents
Foreword
Preface
What Are Hack and HHVM?
Who This Book Is For
Philosophy
Program Types
Gradual Migration
How the Book Is Organized
Versions
Conventions Used in This Book
Safari® Books Online
How to Contact Us
Acknowledgments
Chapter 1. Typechecking
Why Use the Typechecker?
Setting Up the Typechecker
Autoload Everything
Reading Error Messages
Type Annotation Syntax
Function Return Types
Function Parameters
Properties
Hack’s Type System
Typechecker Modes
Code Without Annotations
Calling into PHP
Rules
Using Superglobals
Types of Overriding Methods
Property Initialization
Typed Variadic Arguments
Types for Generators
Fallthrough in switch Statements
Type Inference
Variables Don’t Have Types
Unresolved Types
Inference Is Function-Local
Refining Types
Refining Nullable Types to Non-Nullable
Refining Mixed Types to Primitives
Refining Object Types
Inference on Properties
Enforcement of Type Annotations at Runtime
Chapter 2. Generics
Introductory Example
Other Generic Entities
Functions and Methods
Traits and Interfaces
Type Aliases
Type Erasure
Constraints
Unresolved Types, Revisited
Generics and Subtypes
Arrays and Collections
Advanced: Covariance and Contravariance
Syntax
When to Use Them
Chapter 3. Other Features of Hack
Enums
Enum Functions
Type Aliases
Transparent Type Aliases
Opaque Type Aliases
Autoloading Type Aliases
Array Shapes
Lambda Expressions
Constructor Parameter Promotion
Attributes
Attribute Syntax
Special Attributes
Enhanced Autoloading
Integer Arithmetic Overflow
Nullsafe Method Call Operator
Trait and Interface Requirements
Silencing Typechecker Errors
Chapter 4. PHP Features Not Supported in Hack
References
The global Statement
Top-Level Code
Old-Style Constructors
Case-Insensitive Name Lookup
Variable Variables
Dynamic Properties
Mixing Method Call Syntax
isset, empty, and unset
Others
Chapter 5. Collections
Why Use Collections?
Collections Have Reference Semantics
Using Collections
Literal Syntax
Reading and Writing
Type Annotations for Collections
Core Interfaces
General Collection Interfaces
Specific Collection Interfaces
Concrete Collection Classes
Interoperating with Arrays
Conversion to Arrays
Use with Built-In and User Functions
Chapter 6. Async
Introductory Examples
Async in Detail
Wait Handles
Async and Callable Types
await Is Not an Expression
Async Generators
Exceptions in Async Functions
Mapping and Filtering Helpers
Structuring Async Code
Data Dependencies
Antipatterns
Other Types of Waiting
Sleeping
Rescheduling
Common Mistakes
Dropping Wait Handles
Memoizing Async Functions
Async Extensions
MySQL
MCRouter and memcached
cURL
Streams
Chapter 7. XHP
Why Use XHP?
Runtime Validation
Secure by Default
How to Use XHP
Basic Tag Usage
Attributes
Embedding Hack Code
Type Annotations for XHP
Object Interface
Validation
Creating Your Own XHP Classes
Attributes
children Declarations
Categories
Context
Async XHP
XHP Helpers
XHP Best Practices
No Additional Public API
Composition, Not Inheritance
Don’t Make Control Flow Tags
Distinguish Attributes from Children
Style Guide
Migrating to XHP
Converting Bottom-Up
Getting Around XHP’s Escaping
XHP Internals
The Parser Transformation
The Hack Library
Chapter 8. Configuring and Deploying HHVM
Specifying Configuration Options
Important Options
Server Mode
Warming Up the JIT
Repo-Authoritative Mode
Building the Repo
Deploying the Repo
The Admin Server
Chapter 9. hphpd: Interactive Debugging
Getting Started
Evaluating Code
The Execution Environment
Local Mode
Remote Mode
Using Breakpoints
Setting Breakpoints
Navigating the Call Stack
Navigating Code
Managing Breakpoints
Viewing Code and Documentation
Macros
Configuring hphpd
Chapter 10. Hack Tools
Inspecting the Codebase
Scripting Support
Migrating PHP to Hack
The Hackificator
Inferring and Adding Type Annotations
Transpiling Hack to PHP
Conversions
Unsupported Features
Index
About the Author