Link: Ignorování string parametru když je v cílové metodě defaultní parametr integer
- sharkcz
- Člen | 28
Nette magicky zahazuje parametr odkazu, pokud není typu integer, stejně jako defaultní hodnota parametru v metodě presenteru.
Presenter:
<?php
final class Presenter extends \Nette\Application\Presenter
{
// Default param je 0, pokud je přetypován na '0' tak to projde
public function getList($key = 0) {}
}
?>
Šablona:
<a href="{link list, 1}">První</a>
<a href="{link list, 'test'}">Druhý</a>
Výstup:
<a href="presenter/list/?key=1">První</a>
<a href="presenter/list/">Druhý</a>
Přičemž očekávané URL druhého odkazu je presenter/list/?key=test.
- sharkcz
- Člen | 28
Jenže já chci přijímat řetězce i čísla a výchozí hodnota má být 0. Defaultní hodnota neurčuje, jaký typ parametrů bude metoda přijímat (a metoda link vytvářet), od toho je type hinting. Je mi jasné, že pro skalární typy nelze použít type hinting, ale v tom případě by měl být použit jiný systém, například podle anotací, než znásilnit stávající systém jiným významem.
- David Grudl
- Nette Core | 8228
Je to trošku magické, ale celkem praktické. Zkus
public function getList($key = '0') {}
- sharkcz
- Člen | 28
David Grudl napsal(a):
Je to trošku magické, ale celkem praktické. Zkus
public function getList($key = '0') {}
Na tento hack jsem přišel a je to uvedeno v mém příspěvku, jde mi ale o čistotu použití. Defaultní hodnota by dle mého názoru neměla určovat typ přijatých proměnných. Co kdyby nastala ryze hypotetická situace, kdy bych potřeboval přijímat int 0 i string ‚0‘ s různými význami a integer by byl výchozí?
Btw: Nyní si nedokážu uvědomit praktičnost tichého zahození nevhodných parametrů. Kdyby na to byl vývojář upozorněn alespoň nějakým chybovým hlášením, mohl by situaci napravit v případě, že se jí dopustil omylem. Má-li to nějaký jiný užitečný význam, můžete mě říct jaký?
- redhead
- Člen | 1313
Musíš taky uvažovat trochu z pohledu url. V url jsou parametry všechny
jako string. Když bys chtěl mít dva různé významy pro 0 a
'0'
, jak bys to zapsal v url? ¶m='0'
? Trochu
divné. Spíš naopak ti Nette dává výhodu, že když použiješ výchozí
hodnotu jako int, dostaneš vždy int, i když je to z pohledu url napsáno
jako string.
Používat jednu a tutéž proměnnou pro ukládání hodnot různých datových typů mi přijde jako špatný přístup.
Spíš než to, používáš jednu proměnnou pro dva různé
významy. Jako kdybys do proměnné nazvané $date
ukládal dnešní datum a nebo šablonu presenteru.
Ale souhlasím, že by to mělo alespoň zařvat. Člověk pak neví, co se stalo a proč mu to nefunguje.
Editoval redhead (14. 1. 2011 11:44)