PHP

PHP 8.6: Funkce clamp()

// obsah 2
  1. 01 Jak se to chová?
  2. 02 Kdy to vyhodí chybu?

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í :)

Zdroj: https://wiki.php.net/rfc/clamp_v2

Michal Katuščák
Michal Katuščák

Navrhuji a vyvíjím aplikace nad Symfony a Reactem, zajímám se architekturu softwaru. Žiju v Českých Budějovicích.