Link: Ignorování string parametru když je v cílové metodě defaultní parametr integer

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

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

Nette Framework (version 2.0-dev c1c9de0 released on 2011–01–07)
PHP Version 5.3.3

Aurielle
Člen | 1281
+
0
-

Přijde mi to jako správné a očekávatelné chování. Pokud chceš v jako parametr přijmout string, zadáš výchozí string.

redhead
Člen | 1313
+
0
-

Ano není to bug. Když jsem s Nette začínal, taky mě to překvapilo. Použij null

sharkcz
Člen | 28
+
0
-

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

Je to trošku magické, ale celkem praktické. Zkus public function getList($key = '0') {}

sharkcz
Člen | 28
+
0
-

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ý?

Proki
Člen | 66
+
0
-

sharkcz napsal(a):
Co kdyby nastala ryze hypotetická situace, kdy bych potřeboval přijímat int 0 i string ‚0‘…

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.

Editoval Proki (14. 1. 2011 10:51)

redhead
Člen | 1313
+
0
-

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? &param='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)

sharkcz
Člen | 28
+
0
-

Ano, z pohledu URL dává smysl automatická konverze. Bohužel nedává smysl, že je pro to použita defaultní hodnota parametru, namísto type hintu či anotace z @param.

redhead
Člen | 1313
+
0
-

„Traditional type hinting with int and string isn't supported.“

V tomhle případě se mi anotace moc nelíbí (a ne každý ji chce používat).

sharkcz
Člen | 28
+
0
-

Kdo píše dokumentační komentáře, tak tam tu anotaci už stejně má. Kdo ji nepoužije, nebude mít problém se zmizením parametru, protože prostě dostane řetězec.