Nette Utils 3.2 s podporou PHP 8.1 a Type

před 3 lety od David Grudl  

Knihovny Nette vždy podporují nové verze PHP daleko s předstihem. Balíček Nette Utils 3.2 je už nyní připraven na PHP 8.1. Co se změnilo?

Ze všech novinek PHP 8.1 má největší dopad na Nette Utils zavedení intersection typů, a to konkrétně na třídu Reflection. Jejím úkolem je zejména opravovat nedostatky nativních tříd pro reflexi a sjednocovat chování napříč verzemi PHP.

Trojice metod getParameterType(), getPropertyType() a getReturnType(), která slouží ke zjištění typu parametru, property nebo návratové hodnoty, vznikla v době, kdy PHP mělo jen jednoduché typy, které tyto metody vrací jako string. S union a intersection typy si již nerozumí. Aby bylo možné plně obsáhnout možnosti typového systému PHP, vznikla nová třída Nette\Utils\Type. Uvedené metody tak nahrazuje Type::fromReflection(), která však místo řetězce vrací objekt Type:

use Nette\Utils\Type;

class MyClass
{
	public ?self $foo;
}

$prop = new ReflectionProperty(MyClass::class, 'foo');
$type = Type::fromReflection($prop);
echo $type;                  // '?MyClass'
echo $type->getSingleName(); // 'MyClass'
$type->isUnion();        // true
$type->isIntersection(); // false
$type->isBuiltin();      // false
$type->isClass();        // true

Použití není vázané jen na reflexi, ale můžeme typy vytvářet i dle textového zápisu:

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

Šikovná je funkce allows(), která ověřuje kompatibilitu typů. Například umožní zjistit, zda hodnota určitého typu by mohla být předaná jako parametr.

$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

Tato třída je backportovaná i do Nette Utils v3.1.