1. Hackland Aloe Farm
  2. Hacklang Switch
  3. Hacklang Vec Map
  4. Hacklander Law

Hack is a programming language for the HipHop Virtual Machine (HHVM), created by Facebook as a dialect of PHP.The language implementation is open-source, licensed under the MIT License.

Designed byJulien Verlaguet, Alok Menghrajani, Drew Paroski, and others[1]
First appeared2014
Typing disciplineStatic, dynamic, weak, gradual
LicenseMIT License[2]
Influenced by
PHP, OCaml, Java, C#, Scala, Haskell

Hack is a programming language for the HipHop Virtual Machine (HHVM), created by Facebook as a dialect of PHP. The language implementation is open-source, licensed under the MIT License.[2][3][4]

  1. Hacksplaining is Sponsored by Netsparker Netsparker, the creators of an industry-leading web application security solution, sponsors the Hacksplaining project to increase awareness of web vulnerabilities and help developers write more secure code.
  2. Programming productivity without breaking things.
  3. 'I don't always write PHP, but when I do, I use Hack.'
  4. Hack 在你编写代码的时候会检查你的代码文件并提供即时类型检查,并且它通常在 200 毫秒内即可完成,不会有很明显的延迟,因此你可以很轻松地集成到你的开发流程中去.

Hack allows programmers to use both dynamic typing and static typing. This kind of a type system is called gradual typing, which is also implemented in other programming languages such as ActionScript.[5] Hack's type system allows types to be specified for functionarguments, function return values, and class properties; however, types of local variables are always inferred and cannot be specified.[3][6]


Hack was introduced on March 20, 2014.[7] Before the announcement of the new programming language, Facebook had already implemented the code and 'battle tested' it on a large portion of its web site.


Hack is designed to interoperate seamlessly with PHP, which is a widely used open-source scripting language that has a focus on web development and can be embedded into HTML. A majority of valid PHP scripts are also valid in Hack; however, numerous less frequently used PHP features and language constructs are not supported in Hack.[8]

Hack extends the type hinting available in PHP 5 through the introduction of static typing, by adding new type hints (for example, for scalar types such as integer or string), as well as by extending the use of type hints (for example, for class properties or function return values). However, types of local variables cannot be specified.[6] Since Hack uses a gradual typing system, in the default mode, type annotations are not mandatory even in places they cannot be inferred; the type system will assume the author is correct and admit the code.[9] However, a 'strict' mode is available which requires such annotations, and thus enforces fully sound code.[10]

Syntax and semantics[edit]

The basic file structure of a Hack script is similar to a PHP script with a few changes. A Hack file does not include the <?php opening markup tag and forbids using top-level declarations.[11] Code must be placed in an entrypoint function. These are automatically executed if they are in the top-level file, but not if the file is included via include, require, or the autoloader. Like other functions in Hack, the function names must be unique within a project – i.e. projects with multiple entrypoints can not call both main :

The above script, similar to PHP, will be executed and the following output is sent to the browser:

Hackland Aloe Farm

Unlike PHP, Hack and HTML code do not mix; either XHP or another template engine needs to be used.[8]

Hacklang reflection


Like PHP 7, Hack allows types to be specified for function arguments and function return values. Functions in Hack are thus annotated with types like the following:

See also[edit]


  1. ^Bryan O'Sullivan (2014-03-28). 'Where Credit Belongs for Hack'. Retrieved 2019-02-06.
  2. ^ ab'facebook/hhvm: hhvm / hphp / hack / LICENSE'. github.com. Facebook. 2018-04-11. Retrieved 2019-02-06.
  3. ^ abJosh Lockhart (2014-04-03). 'Facebook's Hack, HHVM, and the future of PHP'. O'Reilly Media. Retrieved 2019-02-06.
  4. ^Cade Metz (2014-03-20). 'Facebook Introduces 'Hack,' the Programming Language of the Future'. Wired. Retrieved 2019-02-06.
  5. ^Aseem Rastogi; Avik Chaudhuri; Basil Hosmer (January 2012). 'The Ins and Outs of Gradual Type Inference'(PDF). Association for Computing Machinery (ACM). Retrieved 2019-02-06.
  6. ^ ab'Hack Manual: Hack and HHVM – Type Annotations'. docs.hhvm.com. Retrieved 2019-02-06.
  7. ^Verlaguet, Julien; Menghrajani, Alok (2014-03-20). 'Hack: a new programming language for HHVM'. Facebook. Retrieved 2019-02-06.
  8. ^ ab'Inconsistencies: Introduction'. docs.hhvm.com. Retrieved 2019-04-04.
  9. ^'Hack Manual: Partial Mode'. docs.hhvm.com. Retrieved 2019-02-06.
  10. ^'Hack Manual: Strict Mode'. docs.hhvm.com. Retrieved 2019-02-06.
  11. ^Emmott, Fred (2019-02-11). 'HHVM 4.0.0'. hhvm.com. Retrieved 2019-05-02.

External links[edit]

  • Official website and language reference
Retrieved from 'https://en.wikipedia.org/w/index.php?title=Hack_(programming_language)&oldid=1018777407'

Sealed classes and interfaces represent restricted class hierarchies that provide more control over inheritance. All subclasses of a sealed class are known at compile time. No other subclasses may appear after a module with the sealed class is compiled. For example, third-party clients can't extend your sealed class in their code. Thus, each instance of a sealed class has a type from a limited set that is known when this class is compiled.

Hacklang Switch

The same works for sealed interfaces and their implementations: once a module with a sealed interface is compiled, no new implementations can appear.

In some sense, sealed classes are similar to enum classes: the set of values for an enum type is also restricted, but each enum constant exists only as a single instance, whereas a subclass of a sealed class can have multiple instances, each with its own state.

To declare a sealed class or interface, put the sealed modifier before its name:

sealed interface Exprsealed class MathExpr(): Exprdata class Const(val number: Double) : MathExpr()data class Sum(val e1: Expr, val e2: Expr) : MathExpr()object NotANumber : Expr

A sealed class is abstract by itself, it cannot be instantiated directly and can have abstract members.

Constructors of sealed classes can have one of two visibilities: protected (by default) or private:

sealed class MathExpr { constructor() { /*..*/ } // protected by default private constructor(vararg operands: Number): this() { /*..*/ } // private is OK // public constructor(s: String): this() {} // Error: public and internal are not allowed}

Location of direct subclasses


Direct subclasses of sealed classes and interfaces must be declared in the same package. They may be top-level or nested inside any number of other named classes, named interfaces, or named objects. Subclasses can have any visibility as long as they are compatible with normal inheritance rules in Kotlin.

Download RimWorld apk 1.0 for Android. Rimworld for sale.

Hacklang Vec Map

Subclasses of sealed classes must have a proper qualified name. They can't be local nor anonymous objects.

enum classes can't extend a sealed class (as well as any other class), but they can implement sealed interfaces.

Inheritance in multiplatform projects

There is one more inheritance restriction in multiplatform projects: direct subclasses of sealed classes must reside in the same source set. It applies to sealed classes without the expect and actual modifiers.

If a sealed class is declared as expect in a common source set and have actual implementations in platform source sets, both expect and actual versions can have subclasses in their source sets. Moreover, if you use a hierarchical structure, you can create subclasses in any source set between the expect and actual declarations.

Learn more about the hierarchical structure of multiplatform projects.

Sealed classes and when expression

The key benefit of using sealed classes comes into play when you use them in a when expression. If it's possible to verify that the statement covers all cases, you don't need to add an else clause to the statement. However, this works only if you use when as an expression (using the result) and not as a statement:

fun eval(expr: Expr): Double = when(expr) { is Const -> expr.number is Sum -> eval(expr.e1) + eval(expr.e2) NotANumber -> Double.NaN // the `else` clause is not required because we've covered all the cases}

Hacklander Law

when expressions on expect sealed classes in the common code of multiplatform projects still require an else branch. This happens because subclasses of actual platform implementations aren't known in the common code.