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)();