Chybu v PHP by mělo nette ignorovat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pawouk
Člen | 172
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8082
+
0
-

fixed