HHVM 3.30 is released! This release has long term support, ending in November 2019.

This release is the final release where we aim to support PHP code, and as such, contains several opt-in changes that break compatibility; as well as the specific options below (which we expect to remove during the next few releases), a hhvm.enable_php=false option is available, which disables support for files that begin with <?php . We do not anticipate removing this option in the immediate future - the primary purpose is to enable testing to make sure that Hack projects do not have hidden PHP dependencies.

New Features

list destructuring of class constants is now supported (e.g. when the class constant is a tuple)

improved performance of C\first , C\first_key , C\last , and C\last_key on containers

, , , and on containers traits may now implement sealed interfaces

Usability

the type-checker error for $shape->foo now suggests $shape['foo']

now suggests added type-checker error for importing the same method from multiple traits (previously a runtime error)

added type-checker error for overriding non-abstract interface constants (previously a runtime error)

added type-checker error for is/as on traits (previously a runtime error)

added type-checker error when calling parent::__construct() if parent does not have a defined constructor (previously a runtime error)

Breaking Changes

is_int() and similar can no longer be used to refine primitive types. Use is int etc instead ( hhast-migrate --is-refinement applies this change)

and similar can no longer be used to refine primitive types. Use etc instead ( applies this change) the <<__Entrypoint>> attribute is now <<__EntryPoint>> ; we consider the syntax stable, however the required function signature is not yet final. We recommend using function(): noreturn or function(): Awaitable<noreturn> for now, to provide the greatest compatibility for potential future changes

attribute is now ; we consider the syntax stable, however the required function signature is not yet final. We recommend using or for now, to provide the greatest compatibility for potential future changes added typechecker error when checking truthiness of Traversable s; this is not a safe/meaningful test given that generators are Traversables

Future Changes