Chybu v PHP by mělo nette ignorovat
- pawouk
- Člen | 172
Narazil jsem na chybu když jsem v presentaru zavolal forward(‚akce‘, FALSE); u druhého paramteru, stále mi to hází chybu:
Invalid value for parameterg 'need', expected boolean.
Která je vyvolána zde:
https://github.com/…flection.php#L155
Předpokládal jsem že je chyba někde v Nette tak jsem si vyzkoušel jednoduchý test mimo nette:
$val = FALSE;
$val === FALSE ? '0' : (string) $val;
print_r(gettype($val));
A zjistil jsem že chyba není v nette, ale v PHP, jak by asi každý předpokládal výše zmíněný výraz by měl být určitě „string“, přesto se vypíše boolean (ověřte to prosím někdo). Nicméně by na to nette mělo reagovat a ignorovat tuto PHP chybu.
- redhead
- Člen | 1313
Určitě by neměl být string! Ty totiž tu proměnnou nepřepisuješ a ten ternární operátor nemá žádný efekt (ani v jednom z obou případů). Když už, tak by to muselo být takhle:
$val = FALSE;
$val = $val === FALSE ? '0' : (string) $val;
print_r(gettype($val));
A to jsem si zcela jist, že už bude string.
- pawouk
- Člen | 172
No jasně, sorry, sem nějak mimo…
Faktem ovšem zůstává že když vložím jako druhý parametr FALSE (tedy
booleam) tak mi vyskočí vyjímka kterou jsem zmiňoval… což vpořádku
určitě není. Chybu tedy vidím v této části v Nette:
if (($val === FALSE ? '0' : (string) $val) !== (string) $args[$name]) {
Správně:
if ((string) $val !== (string) $args[$name]) {
Editoval pawouk (29. 6. 2012 11:57)
- chloris
- Člen | 23
Narazil jsem na tuto chybu, jak píše „pawouk“ také. Volal jsem akci presenteru, jejíž defaultní hodnota parametru byla FALSE. Musel jsem si orpavit třídu Nette\Application\UI\PresenterComponentReflection takto:
//if (($val === FALSE ? '0' : (string) $val) !== (string) $args[$name]) {
if (($val === FALSE ? '0' : (string) $val) !== ($args[$name] === FALSE ? '0' : (string) $args[$name])) {
throw new BadRequestException("Invalid value for parameter '$name', expected ".gettype($def).".");
}
Jinak jsem obdržel tu samou výjimku.
Takže se přimlouvám za fixnutí :-)