Novinky v Nette Utils 3.2

před 4 lety od David Grudl  

Jednou z hlavních novinek Nette Utils 3.2 je nová statická třída Nette\Utils\Floats s užitečnými funkcemi pro porovnávání desetinných čísel.

Třída řeší problém, který zaskočil spoustu programátorů, když zjistili, že neplatí rovnost 0.1 + 0.2 == 0.3. Při matematických operacích s desetinnými čísly dochází k chybám vlivem převodu mezi desítkovou a binární soustavou. Proto při porovnávání musíme tolerovat drobný rozdíl od určitého desetinného místa. A to právě dělá třída Floats.

Následující porovnání už bude fungovat podle očekávání:

Floats::areEqual(0.1 + 0.2, 0.3) // vrací true

Krome této metody nabízí třída řadu dalších užitečných funkcí.

Image

Třída Nette\Utils\Image má dvě nové metody pro detekci typu obrázku detectTypeFromFile() a detectTypeFromString():

$type = Image::detectTypeFromFile('image/logo.gif'); // vrací Image::GIF

Arrays

PHP překvapivě nemá funkce (bez postranních efektů) pro vrácení prvního nebo posledního prvku v poli, proto vznikly ve třídě Nette\Utils\Arrays funkce first() a last(). Pokud je pole prázdné, vrátí null:

Arrays::first([1, 2, 3]); // 1
Arrays::last([1, 2, 3]);  // 3
Arrays::first([]);        // null

Vyhledávání prvků v poli se striktním porovnáváním má na starosti contains():

Arrays::contains([1, 2, 3], 1);    // true
Arrays::contains(['1', false], 1); // false

A nakonec tu máme metodu pro vyvolání všech callbacků v poli:

$callbacks = [
	'+' => function ($a, $b) { return $a + $b; },
	'*' => function ($a, $b) { return $a * $b; },
];

$array = Arrays::invoke($callbacks, 5, 11);
// $array = ['+' => 16, '*' => 55];

A zavolání metody na každém objektu v poli:

$objects = ['a' => $obj1, 'b' => $obj2];

$array = Arrays::invokeMethod($objects, 'foo', 1, 2);
// $array = ['a' => $obj1->foo(1, 2), 'b' => $obj2->foo(1, 2)];

Srozumitelnost

Nette postupně opouští předponu I v názvech rozhraní, takže se mění názvy

  • Nette\Localization\ITranslatorNette\Localization\Translator
  • Nette\Utils\IHtmlStringNette\HtmlStringable (aby korespondovalo se Stringable v PHP).

Mění se název metody Nette\Utils\Arrays::searchKey() na přesnější getKeyOffset().

Samozřejmě původní názvy nadále fungují jako aliasy.

Komentáře

  1. Arrays::first() 👍 To potřebuju co chvila. 🙂

    před 4 lety

Chcete-li odeslat komentář, přihlaste se