News in Nette Utils 3.2
One of the main new features of Nette Utils 3.2 is the new static class
Nette\Utils\Floats
with useful functions for comparing decimal
numbers.
![](https://files.nette.org/blog/monster-1.webp?v=1661803898)
The class solves a problem that surprised many programmers when they found
that equality does not apply for
0.1 + 0.2 == 0.3
. In mathematical operations with decimal numbers,
errors occur due to the conversion between the decimal and binary systems.
Therefore, when comparing floats, we must tolerate a small difference from a
certain decimal place. And that's what the Floats class is doing.
The following comparison will work as expected:
Floats::areEqual(0.1 + 0.2, 0.3) // returns true
In addition to this method, the class offers a number of other useful functions.
Image
Class Nette\Utils\Image
has two new methods for image type
detection detectTypeFromFile()
and
detectTypeFromString()
:
$type = Image::detectTypeFromFile('image/logo.gif'); // returns Image::GIF
Arrays
Surprisingly, PHP does not have functions (without side effects) to return
the first or last element in an array, so functions first()
and
last()
were created in Nette\Utils\Arrays
. If the
array is empty, it returns null
:
Arrays::first([1, 2, 3]); // 1
Arrays::last([1, 2, 3]); // 3
Arrays::first([]); // null
The contains()
searches for elements in with strict
comparison:
Arrays::contains([1, 2, 3], 1); // true
Arrays::contains(['1', false], 1); // false
Finally, we have a method for invoking all callbacks in an array:
$callbacks = [
'+' => function ($a, $b) { return $a + $b; },
'*' => function ($a, $b) { return $a * $b; },
];
$array = Arrays::invoke($callbacks, 5, 11);
// $array = ['+' => 16, '*' => 55];
And to call a method on each object in the array:
$objects = ['a' => $obj1, 'b' => $obj2];
$array = Arrays::invokeMethod($objects, 'foo', 1, 2);
// $array = ['a' => $obj1->foo(1, 2), 'b' => $obj2->foo(1, 2)];
Clarity
Nette gradually leaves the prefix I
in the interface names, so
these changes have taken place:
Nette\Localization\ITranslator
→Nette\Localization\Translator
Nette\Utils\IHtmlString
→Nette\HtmlStringable
(to correspond to Stringable in PHP).
The name of the method Nette\Utils\Arrays::searchKey()
is
changed to more precise getKeyOffset()
.
Of course, the original names still work as aliases.
Sign in to submit a comment