Undefined index u pole a jeho řešení

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

Jaký postup je podle vás lepší preferovat?

Nette\Diagnostics\Debugger::tryError();
$state = $this->states[$data->state]->name;
if(Nette\Diagnostics\Debugger::catchError())
    $state = '_unknown_request_state';

vs

$state = isset($this->states[$data->state]) ? $this->states[$data->state]->name : '_unknown_request_state';

Pokud v poli $this->states existuje požadovaný state, automaticky je to objekt a má property name, takže je otázka pouze na způsobu odchycení undefined indexu.

Jan Tvrdík
Nette guru | 2595
+
0
-

Samozřejmě druhý.

Ascaria
Člen | 187
+
0
-

Nebo spíš jsem se měl zeptat jinak. Jde nějak zařídit, aby warningy a notice vyhazovaly normální exception co jde chytit přez try-catch block?

Filip Procházka
Moderator | 4668
+
0
-

No mělo by to jít, a Nette to i dělá. Mělo by stačit chytat správné výjimky.

Ale měl by sis uvědomit, že vyhazovat výjimku je v PHP dost náročná oprace, protože se do ní musí zkopírovat celý stack trace. Takže

$state = isset($this->states[$data->state])
	? $this->states[$data->state]->name
	: '_unknown_request_state';

bude výrazně rychlejší než

try {
	$state = $this->states[$data->state]->name;

} catch (\ErrorException $e) {
	$state = '_unknown_request_state';
}

Tak asi to nepůjde přímo z Nette, protože to ti výjimku nevyhodí, ale rovnou vykreslí.

Editoval HosipLan (12. 4. 2012 17:42)

Jan Tvrdík
Nette guru | 2595
+
0
-

Viz také https://forum.nette.org/…y-na-vyjimky.

Spíš se hodí si pro také věci napsat zkratky, takže pak můžeš psát třeba

$state = get($this->states, $data->state, '_unknown_request_state')

Přímo v Nette je na to funkce Arrays::get().

$state = Nette\Utils\Arrays::get($this->states, $data->state, '_unknown_request_state');
Ascaria
Člen | 187
+
0
-

@Jan Tvrdík: to poslední je perfektní (ale v mém případě to nejde použít :( ), mělo by se to nějak víc zviditelnit… (a nebo jsem slepej)

edit: Možná by bylo dobré mít to i pro objekty a testovat tim instanceof a nahradit tak zkratkou i zápis:

$x = $data->date_paid instanceof \DibiDateTime ? $data->date_paid->format('j.n.Y') : '_date_unknown';

Editoval Ascaria (13. 4. 2012 12:39)