Malá, ale příjemná novinka. PHP 8.6 přidává funkci clamp(), která ořízne hodnotu do zadaného rozsahu.
Doteď se to psalo kombinací min() a max(). Funguje to, jen mi to pořadí nikdy nezůstane v hlavě:
<?php
$zadanaStranka = 150;
$stranka = max(1, min($zadanaStranka, 100)); // 100
Od PHP 8.6:
<?php
$stranka = clamp($zadanaStranka, 1, 100); // 100
Jak se to chová?
Deklarace je clamp(mixed $value, mixed $min, mixed $max): mixed. Vrátí $value, pokud leží v rozsahu včetně krajních hodnot, jinak vrátí bližší mez:
<?php
clamp(2, 1, 3); // 2
clamp(0, 1, 3); // 1
clamp(6, 1, 3); // 3
Typ je mixed, takže to funguje na všechno, co PHP umí porovnat, tedy i na řetězce nebo objekty DateTime:
<?php
clamp('a', 'c', 'g'); // 'c'
Klidně i s pojmenovanými argumenty, které to udělají čitelnějším:
<?php
$hlasitost = clamp($vstup, min: 0, max: 100);
Kdy to vyhodí chybu?
<?php
clamp(4, 8, 6); // ValueError, protože $min je větší než $max
clamp(4, NAN, 6); // ValueError, protože $min ani $max nesmí být NAN
clamp(NAN, 4, 6); // NAN, bez chyby
NAN v mezích je skoro jistě chyba programátora. V hodnotě to ale klidně může být legitimní výsledek výpočtu, takže mi tohle rozdělení dává smysl.
RFC prošlo v poměru 23 : 3 (a 6 se zdrželo), na tak drobnou funkci překvapivě ostrá diskuze. Hlavní námitkou bylo, že se do standardní knihovny přidává něco, co si každý napíše na tři řádky. Mně to ale nevadí, u stránkování, procent nebo progress barů se kód zkrátí a hlavně zpřehlední :)