Nette Utils 3.2 s podporou PHP 8.1 a Type
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.
Chcete-li odeslat komentář, přihlaste se