Typhoon Type is an object abstraction over the modern PHP type system. Use this library to build tools that work with sophisticated types:
use function Typhoon\Type\arrayShapeT;
use function Typhoon\Type\objectT;
use function Typhoon\Type\nonEmptyListT;
$json = <<<JSON
{
"people": [
{"name": "Valentin"},
{"name": "Andrey"}
],
}
JSON;
final readonly class Person
{
public function __construct(
public string $name,
) {}
}
$type = arrayShapeT([
'people' => nonEmptyListT(objectT(Person::class)),
]);
$request = new Mapper()->map($json, $type);composer require typhoon/type
To print any type, use stringify():
use function Typhoon\Type\stringify;
$type = arrayShapeT([
'people' => nonEmptyListT(objectT(Person::class)),
]);
var_dump(stringify($type));
// array{'people': non-empty-list<Person>}| Typhoon | Native |
|---|---|
nullT |
null |
voidT |
void |
neverT |
never |
falseT |
false |
trueT |
true |
boolT |
bool |
intT |
int |
floatT |
float |
stringT |
string |
arrayT |
array |
objectT |
object |
objectT(Foo::class) |
Foo |
selfT |
self |
parentT |
parent |
staticT |
static |
iterableT |
iterable |
callableT |
callable |
resourceT |
resource |
nullOrT(stringT) |
?string |
unionT(intT, stringT) |
int|string |
intersectionT(objectT(Countable::class), objectT(Traversable::class)) |
Countable&Traversable |
mixedT |
mixed |
| Typhoon | PHPDoc |
|---|---|
intT(123) |
123 |
positiveIntT |
positive-int |
negativeIntT |
negative-int |
nonPositiveIntT |
non-positive-int |
nonNegativeIntT |
non-negative-int |
nonZeroIntT |
non-zero-int |
intRangeT(-5, 6) |
int<-5, 6> |
intRangeT(max: 6) |
int<min, 6> |
intRangeT(min: -5) |
int<-5, max> |
intMaskT(1, 2, 4) |
int-mask<1, 2, 4> |
intMaskT(classConstantMaskT(Foo::class, 'INT_*') |
int-mask-of<Foo::INT_*> |
floatT(12.5) |
12.5 |
floatRangeT(-0.001, 2.344) |
float<-0.001, 2.344> |
| Typhoon | PHPDoc |
|---|---|
nonEmptyStringT |
non-empty-string |
truthyStringT, nonFalsyStringT |
truthy-string, non-falsy-string |
numericStringT |
numeric-string |
lowercaseString |
lowercase-string |
stringT('abc') |
'abc' |
classT(Foo::class), classStringT(Foo::class), classT(objectT(Foo::class)) |
class-string<Foo> |
stringT(Foo::class), classConstantT(Foo::class, 'class') |
Foo::class |
literalStringT |
literal-string |
| Typhoon | PHPDoc |
|---|---|
constantT('PHP_INT_MAX') |
PHP_INT_MAX |
constantMaskT('JSON_*') |
JSON_* |
classConstantT(Foo::class, 'BAR') |
Foo::BAR |
classConstantMaskT(Foo::class, 'IS_*') |
Foo::IS_* |
| Typhoon | PHPDoc |
|---|---|
arrayT(value: objectT(Foo::class)) |
Foo[] |
listT(stringT) |
list<string> |
nonEmptyListT(stringT) |
non-empty-list<string> |
listShapeT([intT, stringT]) |
list{int, string} |
arrayShapeT([intT, optional(stringT)]) |
list{int, 1?: string} |
unsealedListShapeT([intT]) |
list{int, ...} |
unsealedListShapeT([intT], stringT) |
list{int, ...<string>} |
arrayT(value: stringT) |
array<string> |
arrayT(intT, stringT) |
array<int, string> |
nonEmptyArrayT(arrayKeyT, stringT) |
non-empty-array<array-key, string> |
arrayShapeT() |
array{} |
arrayShapeT([intT, stringT]) |
array{int, string} |
arrayShapeT([intT, 'a' => optional(stringT)]) |
array{int, a?: string} |
unsealedArrayShapeT([intT]) |
array{int, ...} |
unsealedArrayShapeT([floatT], intT, stringT) |
array{float, ...<int, string>} |
keyOfT(classConstantT(Foo::class, 'ARRAY')) |
key-of<Foo::ARRAY> |
valueOfT(classConstantT(Foo::class, 'ARRAY')) |
value-of<Foo::ARRAY> |
offsetT($TArray->type, $TKey->type) |
TArray[TKey] |
iterableT(objectT, stringT) |
iterable<object, string> |
iterableT(value: stringT) |
iterable<string> |
| Typhoon | PHPDoc |
|---|---|
objectT(Foo::class, [stringT, floatT]) |
Foo<string, float> |
selfT([stringT, floatT]) |
self<string, float> |
parentT([stringT, floatT]) |
parent<string, float> |
staticT([stringT, floatT]) |
static<string, float> |
objectShapeT(['prop' => stringT]) |
object{prop: string} |
objectShapeT(['prop' => optional(stringT))]) |
object{prop?: string} |
| Typhoon | PHPDoc |
|---|---|
callableT([stringT], voidT) |
callable(string): void |
callableT([param(stringT, default: true)]) |
callable(string=): mixed |
callableT([param(stringT, variadic: true)]) |
callable(string...): mixed |
callableT([param(stringT, byRef: true)]) |
callable(string&): mixed |
closureT([stringT], voidT) |
Closure(string): void |
closureT([param(stringT, default: true)]) |
Closure(string=): mixed |
closureT([param(stringT, variadic: true)]) |
Closure(string...): mixed |
closureT([param(stringT, byRef: true)]) |
Closure(string&): mixed |
| Typhoon | PHPDoc |
|---|---|
array-key |
arrayKeyT |
numericT |
numeric |
scalarT |
scalar |