Třída pro příčetný casting?

David Grudl
Nette Core | 8139
+
+12
-

Chybí mi, že v PHP není k dispozici příčetné přetypování. Operátory jako (string), (int), (bool) přetypují natvrdo bez jakékoliv chybové hlášky. Jsou proto zdrojem chyb a člověk je musí používat velmi opatrně.

Implicitní přetypování, které používá PHP při předávání hodnot do parametrů funkcí nebo properties, funguje daleko lépe. Například do funkce očekávající int lze předat float, ale jen pokud je celočíselný, atd. Jenže tahle vlastnost se týká jen kódu, který nepoužívá declare(strict_types=1), takže s ním má málokdo od Nette zkušenost.

Zajímalo by mě, jestli by bylo užitečné přidat třídu Cast, která by takové příčetné přetypování prováděla. Měla by fungovat vlastně stejně jako to nativní implicitní přetypování v PHP, jen s dvěma drobnými rozdíly: Cast::string(false) by vracelo '0' místo '' a dále Cast::string(1.0) by vracelo '1.0' místo '1'. Chování PHP v těchto dvou případech mi připadá vyloženě jako zdroj chyb.

mystik
Člen | 291
+
0
-

Nedavno sem marne hledal jestli neco presne takoveho neexistuje. Nejbliz tomu co sem nasel bylo https://github.com/…ailing/types ale to je pro vetsinu use cases az zbytecne komplexni.

dakur
Člen | 493
+
0
-

Asi jsem z těch šťastnějších, koho to za ty roky ještě nepotkalo. Nicméně pokud by to tam bylo, asi bych to používal. Je fajn, že nette/utils kryje různýma utilitkama záda nicnetušícím začátečníkům i profíkům.

Felix
Nette Core | 1189
+
0
-

Ano prosim, sam mam tridu Cast/Caster. Hodi se to moc.

m.brecher
Generous Backer | 758
+
0
-

Ano, přetypování v PHP je navrženo špatně, mě třeba vadí nesmyslné přetypování hodnoty null:

(int) null    // přetypuje na 0
(string) null // přetypuje na ''

Hodnota null musí v jakémkoliv přetypování zůstat null. Jednoduché přetypování respektující null jsem si udělal, ale ideální je to mít ve frameworku.

hrach
Člen | 1834
+
-1
-

Ty nullable varianty se podle me chovaji nelogicky – u funkci *OrNull ocekavam, ze vrati null i v pripade, ze hodnota nejde smysluplne konvertovat.

mystik
Člen | 291
+
0
-

Ono nekdy se hodi jen zachovat null a hlasit chybu pokud nejde prevest a nekdy chces null pokud dojde k chybe. Imho by to mohlo byt rozdelene treba na nullableBool (hlasi chybu) a boolOrNull (pri chybe vrati null).