Skip to main content

Anonymous Functions

Hack supports anonymous functions.

In the example below, the anonymous function, $f, evaluates to a function that returns the value of $x + 1.

$f = $x ==> $x + 1;

$two = $f(1); // result of 2

To create an anonymous function with more than one parameter, surround the parameter list with parentheses:

$f = ($x, $y) ==> $x + $y;

$three = $f(1, 2); // result of 3

Anonymous functions pass by value, not by reference. This is also true for any object property passed to an anonymous function.

$x = 5;
$f = $x ==> $x + 1;

$six = $f($x); // pass by value

echo($six); // result of 6
echo("\n");
echo($x); // $x is unchanged; result of 5

If you need to mutate the reference, use the HSL Ref class.

Type Inference​

Unlike named functions, type annotations are optional on anonymous functions. You can still add explicit types if you wish.

$f = (int $x): int ==> $x + 1;

HHVM will enforce type annotations if they are provided.

If typechecking cannot infer a type for a function, it will show an error, and you will need to provide a type. Adding explicit type annotations can also help the typechecker run faster.

Fat Arrow Syntax​

==> defines an anonymous function in Hack. An anonymous function can be a single expression, or a block.

$f1 = $x ==> $x + 1;

$f2 = $x ==> { return $x + 1; };

Legacy PHP-Style Syntax​

Hack also supports an anonymous function syntax similar to PHP. These are less flexible, so we recommend using fat arrow syntax.

$f = function($x) { return $x + 1; };

PHP-style lambdas require an explicit { ... } block.

PHP-style lambdas also require use to refer to enclosing variables. Fat arrow lambdas do not require this.

$y = 1;

$f = function($x) use($y) { return $x + $y; };

PHP-style lambdas can also specify parameter and return types.

$y = 1;

$f = function(int $x): int use($y) { return $x + $y; };

Note that this syntax is not the same as PHP 7 lambdas, which put use before the return type.