Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Aug 7, 2024
1 parent 06b1bd0 commit f9e7146
Showing 1 changed file with 34 additions and 36 deletions.
70 changes: 34 additions & 36 deletions utils/cs/cast.texy
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Běžné přetypování v PHP může být zrádné a vést k neočekávaným vý
(int) '123abc' === 123; // část vstupu byla ignorována
(int) 123.4 === 123; // dochází ke ztrátě informace
(string) 1.0 === '1'; // dochází ke ztrátě informace
(bool) false === ''; // neočekávané, jelikož (bool) true === '1'
// ...
```

Třída `Cast` řeší tyto problémy tím, že poskytuje striktní a bezpečné metody přetypování:
Expand All @@ -35,7 +35,6 @@ Třída `Cast` řeší tyto problémy tím, že poskytuje striktní a bezpečné
Cast::toInt('123abc'); // vyhodí TypeError
Cast::toInt(123.4); // vyhodí TypeError
Cast::toString(1.0) === '1.0';
Cast::toString(false) === '0';
```

Metody třídy `Cast` zajišťují, že:
Expand All @@ -48,55 +47,54 @@ Metody třídy `Cast` zajišťují, že:
Pravidla přetypování
====================

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.

**přísnější kontrola řetězců:**

```php
Cast::toInt('123abc'); // vyhodí TypeError
Cast::toInt(123.4); // vyhodí TypeError
Cast::toString(1.0) === '1.0';
Cast::toString(false) === '0';
```


při převodu na čísla, vyžaduje přesný formát bez dodatečných znaků
- **pole a objekty:** neumožňuje přetypování polí ani objektů na skalární typy
- **převod objektů na pole:** vrátí pole obsahující objekt
- **přesnější převod na řetězec:**

```php
Cast::toString(false) === '0'; // (string) false === ''
Cast::toString('1.0') === '1.0'; (string) 1.0 === '1'
```

Následující tabulka shrnuje, jak funguje konverze různých typů vstupních a výstupních hodnot:
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í.

| Vstupní hodnota | Cílový typ | Komentář |
|-----------------|------------|----------|
| int, float | bool | `0` / `0.0` -> `false`, jinak `true`
| string | bool | `"1"` -> `true`, `"0"` / `""` -> `false`, jinak TypeError
| array / object | bool | TypeError: nepřevoditelné na bool
| string | bool | `'1'` -> `true`, `'0'` / `''` -> `false`, jinak TypeError
| null | bool | `false`
| array / object | bool | TypeError: nepřevoditelné
| bool | int | `true` -> `1`, `false` -> `0`
| float | int | převede se, pokud je bez desetinné části, jinak TypeError
| string | int | převede se, pokud obsahuje celé číslo, jinak TypeError
| array / object | int | TypeError: nepřevoditelné na int
| null | int | `0`
| array / object | int | TypeError: nepřevoditelné
| bool | float | `true` -> `1.0`, `false` -> `0.0`
| int | float | převádí se přímo
| string | float | převede se, pokud představuje číslo, jinak TypeError
| array / object | float | TypeError: nepřevoditelné na float
| bool | string | `true` -> `"1"`, `false` -> `"0"`
| null | float | `0.0`
| array / object | float | TypeError: nepřevoditelné
| bool | string | `true` -> `'1'`, `false` -> `'0'`
| int | string | převádí se na řetězcovou reprezentaci
| float | string | převádí se na řetězec, zachovává desetinnou tečku
| array / object | string | TypeError: array nelze převést na string
| *cokoliv* | array | `null` -> prázdné pole, ostatní se obalí do jednoprvkového pole
| null | string | `'0'`
| array / object | string | TypeError: nepřevoditelné
| null | array | `[]`
| *cokoliv* | array | obalí do jednoprvkového pole


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:

```php
// vyžaduje přesný formát řetězců bez dodatečných znaků
Cast::toInt('123abc'); // vyhodí TypeError
Cast::toInt(''); // vyhodí TypeError

Tato verze tabulky poskytuje ještě přehlednější pohled na chování Cast třídy, používá obecnější kategorie vstupních hodnot a zachovává důležité informace o specifických případech a potenciálních chybách.
✓ - Přetypování je vždy povoleno
✓* - Přetypování je povoleno pokud nedojde ke ztrátě informace
✗ - Přetypování není povoleno, vyhodí TypeError
// zabraňuje ztrátě informace z čísla
Cast::toInt(123.4); // vyhodí TypeError
Cast::toInt(PHP_INT_MAX + 1); // vyhodí TypeError

// neumožňuje přetypování polí ani objektů na skalární typy
Cast::toInt([]); // vyhodí TypeError

// neumožňuje přetypování objektů na pole
Cast::toArray($obj) === [$obj]; // obalí objekt do jednoprvkového pole

// nedochází ke zkreslení při přetypování na string
Cast::toString(1.0) === '1.0'; // PHP by vrátilo '1'
Cast::toString(false) === '0'; // PHP by vrátilo ''
```


Metody pro přetypování
Expand Down

0 comments on commit f9e7146

Please sign in to comment.