Built In Types: Classname
For the most part, we deal with class types directly via their names. For example:
class Employee {
// ...
}
$emp = new Employee();
However, in some applications, it is useful to be able to abstract a class' name rather than to hard-code it. Consider the following:
<<__ConsistentConstruct>>
class Employee {
// ...
}
function f(classname<Employee> $clsname): void {
$w = new $clsname(); // create an object whose type is passed in
}
This function can be called with the name of the class Employee
or any of its
subclasses.
class Intern extends Employee {
// ...
}
function demo(): void {
f(Employee::class); // will call: new Employee();
f(Intern::class); // will call: new Intern();
f(Vector::class); // typechecker error!
}
In Hack code, the class names must be specified using "::class
literals"
(SomeClassName::class
). At runtime, these are regular strings (SomeClassName::class === 'SomeClassName'
).
The value of an expression of a classname type can be converted implicitly or explicitly to string
.
Thank You!
Thank You! If you'd like to share more feedback, please file an issue.