Más contenido relacionado Similar a PHP to Hack at Slack (20) PHP to Hack at Slack9. ● 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