Skip to content

Commit 4761053

Browse files
committed
nette/utils 4.0.5
1 parent fb18de3 commit 4761053

File tree

4 files changed

+165
-7
lines changed

4 files changed

+165
-7
lines changed

utils/cs/@home.texy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Nástroje
55
V balíčku `nette/utils` najdete sadu užitečných tříd pro každodenní použití:
66

77
| [Callback] | Nette\Utils\Callback
8+
| [Bezpečné přetypování |cast] | Nette\Utils\Cast
89
| [Datum a čas |datetime] | Nette\Utils\DateTime
910
| [Finder] | Nette\Utils\Finder
1011
| [HTML elementy |html-elements] | Nette\Utils\Html

utils/cs/@left-menu.texy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Balíček nette/utils
22
*******************
33
- [Callbacky |callback]
4+
- [Bezpečné přetypování |cast]
45
- [Datum a čas |datetime]
56
- [Finder]
67
- [Floats]

utils/cs/cast.texy

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
Bezpečné přetypování
2+
********************
3+
4+
.[perex]
5+
[api:Nette\Utils\Cast] je třída poskytující bezpečné a bezztrátové přetypování. Na rozdíl od standardních PHP operátorů přetypování vyhodí TypeError, pokud by konverze vedla ke ztrátě dat. Podporuje typy bool, int, float, string a array.
6+
7+
Instalace:
8+
9+
```shell
10+
composer require nette/utils
11+
```
12+
13+
Všechny příklady předpokládají vytvořený alias:
14+
15+
```php
16+
use Nette\Utils\Cast;
17+
```
18+
19+
20+
Motivace
21+
========
22+
23+
Běžné přetypování v PHP může být zrádné a vést k neočekávaným výsledkům:
24+
25+
```php
26+
(int) '123abc' === 123; // část vstupu byla ignorována
27+
(int) 123.4 === 123; // dochází ke ztrátě informace
28+
(string) 1.0 === '1'; // dochází ke ztrátě informace
29+
```
30+
31+
Třída `Cast` řeší tyto problémy tím, že poskytuje striktní a bezpečné metody přetypování:
32+
33+
```php
34+
Cast::toInt('123abc'); // vyhodí TypeError
35+
Cast::toInt(123.4); // vyhodí TypeError
36+
Cast::toString(1.0) === '1.0';
37+
```
38+
39+
Metody třídy `Cast` zajišťují, že:
40+
41+
- Nedojde ke ztrátě dat nebo přesnosti
42+
- Neplatné vstupy nejsou tiše převedeny na neočekávané hodnoty
43+
- Komplexní typy (např. objekty) nejsou implicitně převedeny na jednoduché typy
44+
45+
46+
Pravidla přetypování
47+
====================
48+
49+
Následující tabulka shrnuje, jak funguje konverze různých typů vstupních a výstupních hodnot. Nejsou v ní uvedeny případy, kdy má vstup stejný typ jako výstup, pak k žádné konverzi nedochází.
50+
51+
| Vstupní hodnota | Cílový typ | Komentář |
52+
|-----------------|------------|----------|
53+
| int, float | bool | `0` / `0.0` -> `false`, jinak `true`
54+
| string | bool | `'1'` -> `true`, `'0'` / `''` -> `false`, jinak TypeError
55+
| null | bool | `false`
56+
| array / object | bool | TypeError: nepřevoditelné
57+
| bool | int | `true` -> `1`, `false` -> `0`
58+
| float | int | převede se, pokud je bez desetinné části, jinak TypeError
59+
| string | int | převede se, pokud obsahuje celé číslo, jinak TypeError
60+
| null | int | `0`
61+
| array / object | int | TypeError: nepřevoditelné
62+
| bool | float | `true` -> `1.0`, `false` -> `0.0`
63+
| int | float | převádí se přímo
64+
| string | float | převede se, pokud představuje číslo, jinak TypeError
65+
| null | float | `0.0`
66+
| array / object | float | TypeError: nepřevoditelné
67+
| bool | string | `true` -> `'1'`, `false` -> `'0'`
68+
| int | string | převádí se na řetězcovou reprezentaci
69+
| float | string | převádí se na řetězec, zachovává desetinnou tečku
70+
| null | string | `'0'`
71+
| array / object | string | TypeError: nepřevoditelné
72+
| null | array | `[]`
73+
| *cokoliv* | array | obalí do jednoprvkového pole
74+
75+
76+
Třída `Cast` funguje podobně jako nativní type-juggling v PHP, ale s několika důležitými rozdíly, které ji činí bezpečnější a předvídatelnější alternativou.
77+
78+
Vyžaduje přesný formát řetězců bez dodatečných znaků:
79+
80+
```php
81+
Cast::toInt('123abc'); // vyhodí TypeError
82+
Cast::toInt(''); // vyhodí TypeError
83+
```
84+
85+
Zabraňuje ztrátě informace z čísla:
86+
87+
```php
88+
Cast::toInt(123.4); // vyhodí TypeError
89+
Cast::toInt(PHP_INT_MAX + 1); // vyhodí TypeError
90+
```
91+
92+
Neumožňuje přetypování polí ani objektů na skalární typy:
93+
94+
```php
95+
Cast::toInt([]); // vyhodí TypeError
96+
```
97+
98+
Neumožňuje přetypování objektů na pole:
99+
100+
```php
101+
Cast::toArray($obj) === [$obj]; // obalí objekt do jednoprvkového pole
102+
```
103+
104+
Nedochází ke zkreslení při přetypování na string:
105+
106+
```php
107+
Cast::toString(1.0) === '1.0'; // PHP by vrátilo '1'
108+
Cast::toString(false) === '0'; // PHP by vrátilo ''
109+
```
110+
111+
112+
Metody pro přetypování
113+
======================
114+
115+
Třída `Cast` poskytuje následující metody pro bezpečné přetypování:
116+
117+
- `toBool(mixed $value): bool`
118+
- `toInt(mixed $value): int`
119+
- `toFloat(mixed $value): float`
120+
- `toString(mixed $value): string`
121+
- `toArray(mixed $value): array`
122+
123+
Každá z těchto metod má také variantu `...OrNull()`, která vrací null, pokud je vstupní hodnota null. Tedy nedochází k přetypování null:
124+
125+
- `toBoolOrNull(mixed $value): ?bool`
126+
- `toIntOrNull(mixed $value): ?int`
127+
- `toFloatOrNull(mixed $value): ?float`
128+
- `toStringOrNull(mixed $value): ?string`
129+
- `toArrayOrNull(mixed $value): ?array`
130+
131+
132+
Další metody
133+
============
134+
135+
to(mixed $value, string $type): mixed .[method]
136+
-----------------------------------------------
137+
Bezpečně převede hodnotu na zadaný typ. Podporované typy jsou `'bool'`, `'int'`, `'float'`, `'string'` a `'array'`.
138+
139+
```php
140+
$result = Cast::to($value, 'int');
141+
```
142+
143+
144+
toOrNull(mixed $value, string $type): mixed .[method]
145+
-----------------------------------------------------
146+
Bezpečně převede hodnotu na zadaný typ, ale vrací null, pokud je vstupní hodnota null. Podporované typy jsou `'bool'`, `'int'`, `'float'`, `'string'` a `'array'`.
147+
148+
```php
149+
$result = Cast::toOrNull($value, 'int');
150+
```
151+
152+
153+
falseToNull(mixed $value): mixed .[method]
154+
------------------------------------------
155+
Převede `false` na `null`, ostatní hodnoty nemění. Tato metoda je užitečná při práci se staršími PHP funkcemi, které v případě neúspěchu vracejí `false`, a umožňuje elegantně převést staré rozhraní na modernější API používající `null`.
156+
157+
```php
158+
$row = Cast::falseToNull($pdo->fetch(PDO::FETCH_ASSOC));
159+
if ($row === null) {
160+
echo 'Žádné další řádky';
161+
}
162+
```

utils/cs/helpers.texy

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,7 @@ Helpers::compare(10, '<', 20); // true
5353

5454
falseToNull(mixed $value): mixed .[method]
5555
------------------------------------------
56-
57-
Převádí `false` na `null`, jiné hodnoty nemění.
58-
59-
```php
60-
Helpers::falseToNull(false); // null
61-
Helpers::falseToNull(123); // 123
62-
```
56+
Použijte [Cast::falseToNull()|Cast#falseToNull].
6357

6458

6559
getLastError(): string .[method]

0 commit comments

Comments
 (0)