SlideShare a Scribd company logo
Scott Sandler - June 2019
Scott Sandler
Senior Staff Engineer
@ Slack 2015 - Present
PHP to Hack at Slack
PHP to Hack at Slack
PHP to Hack at Slack
PHP to Hack at Slack
PHP to Hack at Slack
PHP to Hack at Slack
● Static type checker, hh_client
● Language Server Protocol
● VSCode, VIM, Emacs, and more
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
“Generic programming is a style of computer programming in
which algorithms are written in terms of types
to-be-specified-later that are then instantiated when needed
for specific types provided as parameters.”
- Wikipedia
Type Parameters like <T> allow classes, functions, and data
structures to act on multiple types
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Represent an array with known structure
● Named keys with known data types
○ Keys can be optional
● Structural subtyping
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
PHP to Hack at Slack
● Inconsistent Argument Order
○ array_map($callback, $array);
○ array_filter($array, $callback);
● Misleading return types
○ strpos() returns int OR false
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
Read from inside out…
or split into multiple lines and
name each intermediate value?
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Consistent Argument Order
● Consistent Return Types
○ null instead of false
● Namespaces:
○ Container Functions: Vec*, Dict*, Keyset*, C*
○ Basics: Str*, Regex*, Math*
○ More: IO*, PseudoRandom*, SecureRandom*
● |> Pipeline operator for chaining function calls
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● Overview
● Static Type Checking
● Generics
○ Arrays
○ Hack Arrays
○ Shapes
● Standard Library
○ Pipeline
○ Typed Regex
● XHP
● async/await cooperative multi-tasking
● is/as keywords for type assertion
● lambdas
● enums
● <<__Memoize>> caching
● hackfmt
● Function Autoloading
● VSCode debugging
Migrating Slack
PHP to Hack at Slack
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Fix hh_client errors
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● Hundreds of bugs
● Convince typechecker
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
New Linter: HHAST
● Hack Abstract Syntax Tree
● More rigorous linters
● Migrations as well
Old Linter: PHP_CodeSniffer
● Stream of tokens
● Each linter is a mini-PHP
parser
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into
functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Foundational
Types
After: AsyncMysqlClient
● Shapes for each table
● Async queries
Before: mysqli
● Untyped arrays of strings
● Synchronous queries
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Untyped code
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Untyped code
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Type Coverage
Colorized Type Coverage
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Coverage Numbers
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Track it and pipe it to Slack
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
<?hh // strict
1. All functions and arguments must be typed
2. No top-level code
3. Other dynamicism like $GLOBALS banned
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
Eliminate PHP Dependencies
1. Smarty to XHP migration
○ Smarty Parser -> hack-codegen
2. Other dependencies:
○ Convert to Hack
○ Remove dependency
○ Run as PHP7 web service
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
HHVM 4.0 Upgrade
● <?php to <?hh
● Fix hh_client errors
● Blocking CI tests
○ hh_client
○ Linter
● Move code into functions
● Foundational Types
○ DB Shapes
○ Inferred returns
○ Untyped code
● Coverage Competition
● <?hh // strict
● Eliminate PHP deps
● HHVM 4.0 upgrade
PHP to Hack at Slack
● Thousands of bugs found and fixed
● Entire classes of problems eliminated
○ Call to undefined function
○ Missing include/require
○ Missing array keys
○ Missing null checks
● Developer Surveys
● Increased confidence
● Increased productivity
● “When the type checker passes, my code usually works on
the first try”
PHP to Hack at Slack
UI
Integration
Unit
UI
Integration
Unit
Types
● Types are the cheapest unit test
○ ...but only when you have a lot of them
● Types are the cheapest documentation
○ Especially complex types like shapes
● Typing is best done as part of feature work
Lessons Learned
PHP to Hack at Slack
PHP to Hack at Slack
Yes, this is possible
● Generics RFC
● Arrow functions in 7.4
● Property type hints
● JIT in PHP8
● Static analysis:
○ phan: https://github.com/phan/phan
○ phpstan: https://github.com/phpstan/phpstan
○ psalm: https://github.com/vimeo/psalm
● eval(), create_function(), extract(), compact()
● $GLOBAL variables
● $$variable variables
● call_user_func()
● &$references
Avoid PHP’s most dangerous features
PHP to Hack at Slack

More Related Content

PDF
PHP, the GraphQL ecosystem and GraphQLite
PDF
EclipseCon France 2017 - Xtending Our Vhdl Xtext Formatter With The Formatter...
PDF
Vhdl 2017: new and noteworthy
PPTX
Automated Testing with rails
PDF
EclipseCon Europe 2017 - Taming complex chip designs with beautiful diagrams
PDF
PSR7 - interoperabilità HTTP
PPTX
Dmytro Dziubenko "Developer's toolchain"
PDF
ReactiveX
PHP, the GraphQL ecosystem and GraphQLite
EclipseCon France 2017 - Xtending Our Vhdl Xtext Formatter With The Formatter...
Vhdl 2017: new and noteworthy
Automated Testing with rails
EclipseCon Europe 2017 - Taming complex chip designs with beautiful diagrams
PSR7 - interoperabilità HTTP
Dmytro Dziubenko "Developer's toolchain"
ReactiveX

Similar to PHP to Hack at Slack (20)

PDF
Heterogenous Persistence
PDF
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
PDF
Let’s template
PDF
The secret of PHP7's Performance
PDF
Introduction to GraphQL with Ruby
PDF
My 10 favorite haxe language features in 30 mins
PDF
What’s new in VictoriaLogs Q1 2025
PPTX
Php Tutorial
PDF
Typed Drupal - A great combination of Drupal 8 and PHP 7
PDF
Frankfurt TYPO3 User Group (FTUG) 2017.11.15
PDF
Quality Assurance in PostgreSQL
PDF
Simplify Access to Data from Pivotal GemFire Using the GraphQL (G2QL) Extension
PDF
Build real time stream processing applications using Apache Kafka
PDF
Extract Method Refactoring Workshop (2016)
PDF
Goodpractice
PPTX
Php 5.6 vs Php 7 performance comparison
PDF
IDE and Toolset For Magento Development
PDF
PHP 7X New Features
PDF
Enforcing API Design Rules for High Quality Code Generation
PDF
Os Koziarsky
Heterogenous Persistence
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
Let’s template
The secret of PHP7's Performance
Introduction to GraphQL with Ruby
My 10 favorite haxe language features in 30 mins
What’s new in VictoriaLogs Q1 2025
Php Tutorial
Typed Drupal - A great combination of Drupal 8 and PHP 7
Frankfurt TYPO3 User Group (FTUG) 2017.11.15
Quality Assurance in PostgreSQL
Simplify Access to Data from Pivotal GemFire Using the GraphQL (G2QL) Extension
Build real time stream processing applications using Apache Kafka
Extract Method Refactoring Workshop (2016)
Goodpractice
Php 5.6 vs Php 7 performance comparison
IDE and Toolset For Magento Development
PHP 7X New Features
Enforcing API Design Rules for High Quality Code Generation
Os Koziarsky

Recently uploaded (20)

PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Encapsulation theory and applications.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPT
Teaching material agriculture food technology
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
sap open course for s4hana steps from ECC to s4
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
Advanced methodologies resolving dimensionality complications for autism neur...
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Encapsulation theory and applications.pdf
Empathic Computing: Creating Shared Understanding
Dropbox Q2 2025 Financial Results & Investor Presentation
Diabetes mellitus diagnosis method based random forest with bat algorithm
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Teaching material agriculture food technology
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Spectral efficient network and resource selection model in 5G networks
Review of recent advances in non-invasive hemoglobin estimation
sap open course for s4hana steps from ECC to s4
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Building Integrated photovoltaic BIPV_UPV.pdf

PHP to Hack at Slack

  • 1. Scott Sandler - June 2019
  • 2. Scott Sandler Senior Staff Engineer @ Slack 2015 - Present
  • 9. ● Static type checker, hh_client ● Language Server Protocol ● VSCode, VIM, Emacs, and more ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 10. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 11. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 12. “Generic programming is a style of computer programming in which algorithms are written in terms of types to-be-specified-later that are then instantiated when needed for specific types provided as parameters.” - Wikipedia Type Parameters like <T> allow classes, functions, and data structures to act on multiple types ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 13. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 14. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 15. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 16. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 17. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 18. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 19. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 20. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 21. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 22. ● Represent an array with known structure ● Named keys with known data types ○ Keys can be optional ● Structural subtyping ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 23. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 24. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 25. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 26. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 28. ● Inconsistent Argument Order ○ array_map($callback, $array); ○ array_filter($array, $callback); ● Misleading return types ○ strpos() returns int OR false ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 29. Read from inside out… or split into multiple lines and name each intermediate value? ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 30. ● Consistent Argument Order ● Consistent Return Types ○ null instead of false ● Namespaces: ○ Container Functions: Vec*, Dict*, Keyset*, C* ○ Basics: Str*, Regex*, Math* ○ More: IO*, PseudoRandom*, SecureRandom* ● |> Pipeline operator for chaining function calls ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 31. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 32. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 33. ● Overview ● Static Type Checking ● Generics ○ Arrays ○ Hack Arrays ○ Shapes ● Standard Library ○ Pipeline ○ Typed Regex ● XHP
  • 34. ● async/await cooperative multi-tasking ● is/as keywords for type assertion ● lambdas ● enums ● <<__Memoize>> caching ● hackfmt ● Function Autoloading ● VSCode debugging
  • 37. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 38. Fix hh_client errors ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 39. ● Hundreds of bugs ● Convince typechecker ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 40. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 41. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 42. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 43. New Linter: HHAST ● Hack Abstract Syntax Tree ● More rigorous linters ● Migrations as well Old Linter: PHP_CodeSniffer ● Stream of tokens ● Each linter is a mini-PHP parser ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 44. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 46. After: AsyncMysqlClient ● Shapes for each table ● Async queries Before: mysqli ● Untyped arrays of strings ● Synchronous queries ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 47. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 48. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 49. ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 50. Untyped code ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 51. Untyped code ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 53. Colorized Type Coverage ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 54. Coverage Numbers ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 55. Track it and pipe it to Slack ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 56. <?hh // strict 1. All functions and arguments must be typed 2. No top-level code 3. Other dynamicism like $GLOBALS banned ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 57. Eliminate PHP Dependencies 1. Smarty to XHP migration ○ Smarty Parser -> hack-codegen 2. Other dependencies: ○ Convert to Hack ○ Remove dependency ○ Run as PHP7 web service ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 58. HHVM 4.0 Upgrade ● <?php to <?hh ● Fix hh_client errors ● Blocking CI tests ○ hh_client ○ Linter ● Move code into functions ● Foundational Types ○ DB Shapes ○ Inferred returns ○ Untyped code ● Coverage Competition ● <?hh // strict ● Eliminate PHP deps ● HHVM 4.0 upgrade
  • 60. ● Thousands of bugs found and fixed ● Entire classes of problems eliminated ○ Call to undefined function ○ Missing include/require ○ Missing array keys ○ Missing null checks
  • 61. ● Developer Surveys ● Increased confidence ● Increased productivity ● “When the type checker passes, my code usually works on the first try”
  • 65. ● Types are the cheapest unit test ○ ...but only when you have a lot of them ● Types are the cheapest documentation ○ Especially complex types like shapes ● Typing is best done as part of feature work Lessons Learned
  • 68. Yes, this is possible ● Generics RFC ● Arrow functions in 7.4 ● Property type hints ● JIT in PHP8 ● Static analysis: ○ phan: https://github.com/phan/phan ○ phpstan: https://github.com/phpstan/phpstan ○ psalm: https://github.com/vimeo/psalm
  • 69. ● eval(), create_function(), extract(), compact() ● $GLOBAL variables ● $$variable variables ● call_user_func() ● &$references Avoid PHP’s most dangerous features