Type PHP

Nette\Utils\Type représente un type de données PHP. Elle sert à analyser, comparer et manipuler les types, qu'ils proviennent d'une chaîne ou de la réflexion.

PHP possède aujourd'hui un système de types très riche : des types scalaires (int, string) aux objets et interfaces, en passant par les types complexes (union A|B, intersection A&B ou formes normales disjonctives (A&B)|D). S'y ajoutent des types particuliers comme void, never, mixed, ou les types relatifs self et static.

Travailler nativement avec ces types, en particulier via ReflectionType, est souvent laborieux, car il faut distinguer récursivement ReflectionNamedType, ReflectionUnionType et d'autres objets. La classe Nette\Utils\Type encapsule tout cela et fournit une API unifiée et intuitive pour travailler avec n'importe quel type pris en charge par PHP.

Elle vous permet par exemple de vérifier facilement si un type en accepte un autre (compatibilité), d'étendre des types ou de convertir des réflexions en une notation lisible.

Installation :

composer require nette/utils

Tous les exemples supposent qu'un alias a été créé :

use Nette\Utils\Type;

fromReflection ($reflection): ?Type

Cette méthode statique crée un objet Type à partir de la réflexion. Le paramètre peut être un objet ReflectionMethod ou ReflectionFunction (elle renvoie alors le type de la valeur de retour), ou un objet ReflectionParameter ou ReflectionProperty. Elle résout self, static et parent en nom de classe réel. Si le sujet n'a pas de type, elle renvoie null.

class DemoClass
{
	public self $foo;
}

$prop = new ReflectionProperty(DemoClass::class, 'foo');
echo Type::fromReflection($prop); // 'DemoClass'

fromString (string $type)Type

Cette méthode statique crée un objet Type à partir de sa représentation textuelle.

$type = Type::fromString('Foo|Bar');
echo $type;      // 'Foo|Bar'

fromValue (mixed $value)Type

Méthode statique qui crée un objet Type d'après le type de la valeur passée.

$type = Type::fromValue('hello'); // 'string'
$type = Type::fromValue(123);     // 'int'
$type = Type::fromValue(new stdClass); // 'stdClass'

Pour les ressources, elle retourne mixed, PHP ne connaissant pas le type resource. Pour les classes anonymes, elle retourne le nom de l'ancêtre le plus proche, ou object.

$obj = new class extends Foo { };
$type = Type::fromValue($obj);    // 'Foo'

getNames (): (string|array)[]

Renvoie un tableau de chaînes représentant les sous-types qui composent un type composé. Pour les types intersection, elle renvoie un tableau de tableaux.

$type = Type::fromString('string|null'); // ou '?string'
$type->getNames();  // ['string', 'null']

$type = Type::fromString('(Foo&Bar)|string');
$type->getNames();  // [['Foo', 'Bar'], 'string']

getTypes(): Type[]

Renvoie un tableau d'objets Type représentant les sous-types qui composent un type composé :

$type = Type::fromString('string|null'); // ou '?string'
$type->getTypes();  // [Type::fromString('string'), Type::fromString('null')]

$type = Type::fromString('(Foo&Bar)|string');
$type->getTypes();  // [Type::fromString('Foo&Bar'), Type::fromString('string')]

$type = Type::fromString('Foo&Bar');
$type->getTypes();  // [Type::fromString('Foo'), Type::fromString('Bar')]

getSingleName(): ?string

Pour les types simples (y compris les types nullable simples comme ?string), elle renvoie le nom du type. Sinon, elle renvoie null.

$type = Type::fromString('string|null');
echo $type;                       // '?string'
echo $type->getSingleName();      // 'string'

$type = Type::fromString('?Foo');
echo $type;                       // '?Foo'
echo $type->getSingleName();      // 'Foo'

$type = Type::fromString('Foo|Bar');
echo $type;                       // 'Foo|Bar'
echo $type->getSingleName();      // null

isSimple(): bool

Indique s'il s'agit d'un type simple. Les types nullable simples (par ex. ?string, ?Foo) comptent aussi comme des types simples :

$type = Type::fromString('string');
$type->isSimple();       // true
$type->isUnion();        // false

$type = Type::fromString('?Foo'); // ou 'Foo|null'
$type->isSimple();       // true
$type->isUnion();        // true

isUnion(): bool

Indique s'il s'agit d'un type union (il contient |).

$type = Type::fromString('string|int');
$type->isUnion();        // true

isIntersection(): bool

Indique s'il s'agit d'un type intersection (il contient &).

$type = Type::fromString('Foo&Bar');
$type->isIntersection(); // true

isBuiltin(): bool

Indique si le type est simple et en même temps un type natif de PHP (comme string, int, array, callable, etc.).

$type = Type::fromString('string');
$type->isBuiltin(); // true

$type = Type::fromString('string|int');
$type->isBuiltin(); // false

$type = Type::fromString('Foo');
$type->isBuiltin(); // false

isClass(): bool

Indique si le type est simple et en même temps un nom de classe (et non un type natif comme string ou int).

$type = Type::fromString('string');
$type->isClass();   // false

$type = Type::fromString('Foo|null');
$type->isClass();   // true

$type = Type::fromString('Foo|Bar');
$type->isClass();   // false

isClassKeyword(): bool

Retourne si le type est l'un des types internes self, parent, static.

$type = Type::fromString('self');
$type->isClassKeyword();   // true

$type = Type::fromString('Foo');
$type->isClassKeyword();   // false

allows (string|Type $type)bool

La méthode allows() vérifie la compatibilité des types. Elle permet par exemple de déterminer si une valeur d'un certain type pourrait être passée comme paramètre à une fonction attendant ce type.

$type = Type::fromString('string|null');
$type->allows('string'); // true
$type->allows('null');   // true
$type->allows('Foo');    // false

$type = Type::fromString('mixed');
$type->allows('null');   // true

with (string|Type $type)Type

Retourne un objet Type qui accepte à la fois le type d'origine et celui qu'on lui ajoute. Elle crée un type union.

La méthode est astucieuse et ne duplique pas inutilement les types. Si vous ajoutez un type déjà présent, ou un type qui englobe le type courant (par exemple mixed ajouté à string), le résultat est simplifié.

$type = Type::fromString('string');

// Extension à un string nullable
echo $type->with('null'); // '?string'

// Création d'un type union
echo $type->with('int');  // 'string|int'

// Ajout d'un type qui englobe tout
echo $type->with('mixed'); // 'mixed'
version: 4.x