Undefined index u pole a jeho řešení
- Ascaria
- Člen | 187
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.
- Filip Procházka
- Moderator | 4668
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
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
@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)