striktnější PresenterComponentReflection->combineArgs Exception misto null value

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

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

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ě.

Majkl578
Moderator | 1364
+
0
-

Problém je, že kvůli automatické konverzi typu se defaultní hodnota často uvádí, ačkoliv daná akce/cokoliv smysl bez uvedení hodnoty explicitně smysl nemá.

enumag
Člen | 2118
+
0
-

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

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

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.