Classes: Properties
A property is a variable defined inside a class.
class IntBox {
  public int $value = 0;
}
Instance properties are accessed with ->. Every instance has a
separate value for an instance property.
$b = new IntBox();
$b->value = 42;
Note that there is no $ used when accessing ->value.
Initializing Properties
Properties in Hack must be initialized. You can provide a default value, or assign to them in the constructor.
class HasDefaultValue {
  public int $i = 0;
}
class SetInConstructor {
  public int $i;
  public function __construct() {
    $this->i = 0;
  }
}
Properties with nullable types do not require initial values. They
default to null if not set.
class MyExample {
  public mixed $m;
  public ?string $s;
}
Static Properties
A static property is a property that is shared between all instances of a class.
class Example {
  public static int $val = 0;
}
Static properties are accessed with ::.
Example::$val;
If your property never changes value, you might want to use a class constant instead.
The Property Namespace
Properties and methods are in different namespaces. It's possible to have a method and a property with the same name.
class IntBox {
  public int $value = 0;
  public function value(): int {
    return $this->value;
  }
}
(Reusing a name like this is usually confusing. We recommend you use separate names.)
If there are parentheses, Hack knows it's a method call.
$b = new IntBox();
$b->value(); // method call
$b->value; // property access
If you have a callable value in a property, you will need to be explicit that you're accessing the property.
class FunctionBox {
  public function __construct(public (function(): void) $value) {}
}
Use parentheses to access and call the wrapped function.
$b = new FunctionBox(() ==> { echo "hello"; });
($b->value)();