striktnější PresenterComponentReflection->combineArgs Exception misto null value
- MzK
- Člen | 127
Pokud máme renderMentodu($id) nebo handleMetodu($id), tak se musí v těle metody pokaždé ověřovat, jestli existuje $id?
<?php
function handleDeleteArticle($id)
if ($id) {
//delete
} else {
throw new BadRequestException('Missing argument for method');
}
}
?>
Samozřejmě v PHP volání $this->handleDeleteArticle() bez parametru
vyvolá Warning Missing argument 1 for…
Ale nette pro chybějící parametr doplní null, což není tolik striktní.
<?php
$res[$i++] = $param->isDefaultValueAvailable() && $param->isOptional() ? : ($param->isArray() ? array() : NULL);
?>
Nebo to se to v praxi řeší jinak?
Při generování odkazů to funguje správně – pokud chybí
parametr, vyhodí se invalidLinkException. máš pravdu Honzo, taky to nic
nehlásí, což je dost špatně.
Zahlásí to pouze Passed more parameters than method expects. Ale že parametry
chybí se nedovíme.
Editoval MzK (11. 7. 2013 15:20)
- Jan Tvrdík
- Nette guru | 2595
Já jsem pro, už jsem to kdysi navrhoval.
Při generování odkazů to funguje správně – pokud chybí parametr
Mám dojem, že to funguje úplně stejně špatně.
- enumag
- Člen | 2118
Tak proto je v examplech to pro mne nepochopitelné
$id = 0
…
Nebylo by lepší ten typ číst raději z anotací než z defaultní
hodnoty? Fakt, že se tam může dostat NULL aniž bych to explicitně povolil
pomocí $id = NULL
se mi ani trochu nelíbí. (A protože jsem
o tom nevěděl tak moje aplikace to ani neošetřuje.)
Editoval enumag (11. 7. 2013 17:00)
- Jan Tvrdík
- Nette guru | 2595
Možná je čas oživit RFC https://forum.nette.org/…presenterech. Pořád mi to připadá jako dobrý nápad.
Editoval Jan Tvrdík (11. 7. 2013 17:09)
- David Grudl
- Nette Core | 8227
Do jakékoliv funkce se může dostat NULL aniž bys to explicitně povoloval. Prostě se zavolá s hodnotou NULL.
Zápis $id = 0
je (věřím) dočasné řešení, než v PHP
přijdou s typehinty pro skaláry. Zápis přes anotace jsme už řešili a
není ideální, protože se může velmi snadno rozejít obsah komentáře
s deklarací funkce.
Pokud jde o povinné a volitelné parametry, reflexe v PHP je umí správně identifikovat až od verze PHP 5.3.16. Ještě nedávno byla minimální požadovaná verze 5.2.0, dnes už je to 5.3.1 (z 11/2009), otázka je, jestli skok na rok starou verzi PHP není moc velký problém.