SlideShare una empresa de Scribd logo
1 de 70
Descargar para leer sin conexión
Scott Sandler - June 2019
Scott Sandler
Senior Staff Engineer
@ Slack 2015 - Present
● 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
● 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 <?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
● 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”
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
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

Más contenido relacionado

Similar a PHP to Hack at Slack

Enforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code GenerationEnforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code Generation
Tim Burks
 
Os Koziarsky
Os KoziarskyOs Koziarsky
Os Koziarsky
oscon2007
 

Similar a PHP to Hack at Slack (20)

Heterogenous Persistence
Heterogenous PersistenceHeterogenous Persistence
Heterogenous Persistence
 
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo MazzaferroRESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
 
Let’s template
Let’s templateLet’s template
Let’s template
 
The secret of PHP7's Performance
The secret of PHP7's Performance The secret of PHP7's Performance
The secret of PHP7's Performance
 
Introduction to GraphQL with Ruby
Introduction to GraphQL with RubyIntroduction to GraphQL with Ruby
Introduction to GraphQL with Ruby
 
My 10 favorite haxe language features in 30 mins
My 10 favorite haxe language features in 30 minsMy 10 favorite haxe language features in 30 mins
My 10 favorite haxe language features in 30 mins
 
Php Tutorial
Php TutorialPhp Tutorial
Php Tutorial
 
Typed Drupal - A great combination of Drupal 8 and PHP 7
Typed Drupal - A great combination of Drupal 8 and PHP 7Typed Drupal - A great combination of Drupal 8 and PHP 7
Typed Drupal - A great combination of Drupal 8 and PHP 7
 
Frankfurt TYPO3 User Group (FTUG) 2017.11.15
Frankfurt TYPO3 User Group (FTUG) 2017.11.15Frankfurt TYPO3 User Group (FTUG) 2017.11.15
Frankfurt TYPO3 User Group (FTUG) 2017.11.15
 
Quality Assurance in PostgreSQL
Quality Assurance in PostgreSQLQuality Assurance in PostgreSQL
Quality Assurance in PostgreSQL
 
Simplify Access to Data from Pivotal GemFire Using the GraphQL (G2QL) Extension
Simplify Access to Data from Pivotal GemFire Using the GraphQL (G2QL) ExtensionSimplify Access to Data from Pivotal GemFire Using the GraphQL (G2QL) Extension
Simplify Access to Data from Pivotal GemFire Using the GraphQL (G2QL) Extension
 
Build real time stream processing applications using Apache Kafka
Build real time stream processing applications using Apache KafkaBuild real time stream processing applications using Apache Kafka
Build real time stream processing applications using Apache Kafka
 
Extract Method Refactoring Workshop (2016)
Extract Method Refactoring Workshop (2016)Extract Method Refactoring Workshop (2016)
Extract Method Refactoring Workshop (2016)
 
Goodpractice
GoodpracticeGoodpractice
Goodpractice
 
Php 5.6 vs Php 7 performance comparison
Php 5.6 vs Php 7 performance comparisonPhp 5.6 vs Php 7 performance comparison
Php 5.6 vs Php 7 performance comparison
 
IDE and Toolset For Magento Development
IDE and Toolset For Magento DevelopmentIDE and Toolset For Magento Development
IDE and Toolset For Magento Development
 
PHP 7X New Features
PHP 7X New FeaturesPHP 7X New Features
PHP 7X New Features
 
Enforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code GenerationEnforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code Generation
 
Os Koziarsky
Os KoziarskyOs Koziarsky
Os Koziarsky
 
MariaDB Paris Workshop 2023 - Performance Optimization
MariaDB Paris Workshop 2023 - Performance OptimizationMariaDB Paris Workshop 2023 - Performance Optimization
MariaDB Paris Workshop 2023 - Performance Optimization
 

Último

Último (20)

Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 

PHP to Hack at Slack

  • 1. Scott Sandler - June 2019
  • 2. Scott Sandler Senior Staff Engineer @ Slack 2015 - Present
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 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
  • 27.
  • 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
  • 36.
  • 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
  • 59.
  • 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”
  • 62.
  • 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
  • 66.
  • 67.
  • 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