Jak v latte chytře zapsat {if $a}{$a->name}{/if} jinak?
- jasir
- Člen | 746
No, možná to někde už je a mě jenom dneska hrabe, ale hodilo by se mi, aby v latte šla zapsat taková konstrukce:
{if $director}
{$director-subject->names->individual}
{/if}
Zapisuji to takto:
{$director ? $director->subject->names->individual : ''}
…ale štvě mě tam to „: ''
“. Nešlo by to nějak
vynechat? A nebo co rovnou v latte implementovat existential operator
z coffeescriptu.
{$director?->subject?->names?->individual}
Editoval jasir (11. 6. 2012 17:59)
- Jan Tvrdík
- Nette guru | 2595
Když tě to štve, tak proč to tam píšeš?
{$director ? $director->subject->names->individual}
- Jan Tvrdík
- Nette guru | 2595
Ten se mi líbí :)
Chápu dobře, že {$a?->b?->c}
by se přeložilo jako
<?php echo isset($a) : (isset($a->b ? $a->b->c : NULL) : NULL); ?>
Nebo jak si to představuješ?
- jasir
- Člen | 746
Okej, pokusil jsem se to implementovat: https://github.com/…te/pull/1033
Zatím jako proof-of-concept.
- David Grudl
- Nette Core | 8227
Psát někde {$a?->b?['c']?->d()}
mi připadá děsně
stupidní… Proč vůbec tolik otazníků?
- Filip Procházka
- Moderator | 4668
Když už to musí být, tak mně by se líbila syntaxe
{$a->b['c']->d()|?}
, jakože magickej helper :)
Ale obecně bych raději doporučil nastudovat si null-object pattern.
Editoval Filip Procházka (14. 4. 2013 18:47)
- Jan Tvrdík
- Nette guru | 2595
@David Grudl: Většinou nejsou všechny úrovně
možná NULL
.
@Filip Procházka: To se mi nelíbí. Nechci to automaticky na všechny úrovně. Mohl bych si tak omylem schovat nějakou chybu.
- jasir
- Člen | 746
@Jan Tvrdík +1
Je to prostě nový operátor ?->, takže kde se použije, tam je otazník. Proto tolik otazníků. Inspirací byl coffescript existential operator:
<script>
zip = lottery.drawWinner?().address?.zipcode
</script>
Funguje to stejně, akorát že v php je ?→ (zdá se mi to logické)
Je pravda, že Nette do teď kromě vylepšení polí a ternárního operátoru nijak php kód neupravovala, toto je první vlaštovka
Edit: viz také „Safe Navigation Operator“ z groovy
Editoval jasir (13. 4. 2013 20:45)
- David Grudl
- Nette Core | 8227
Vlaštovka rozhodně není mrtvá, jen to chce důkladněji promyslet.
Rozhodně bych to neimplementoval jako operátor ?->
, ale
čistě jako otazník, aby fungovalo třeba {$a?}
.
Také je třeba řešit vnoření, jako např. $a?[ $b?->c ]
,
ujasnit si, zda {$a?->b?->c?}
je totéž jako
{$a->b->c?}
a jak implementovat výraz, kde je volání
funkce {$a->b()?}
, který nelze vložit do isset. Asi by nemělo
být povoleno {$a->b?()}
.
- jasir
- Člen | 746
Jen malá poznámka, v mém pokusné implementaci volání metod {$a->getMessage()?->text} funguje snad dobře. Je pravda, že jsem implementoval pouze property access, na arraye to není. Jede to přes is_object, nikoliv isset.
Samotný otaznímk mě ani nenapadlo zvažovat, nechtěl jsem modifikovat chování stávajícího (ternárního) operátoru.
- Majkl578
- Moderator | 1364
David Grudl napsal(a):
kde je volání funkce
{$a->b()?}
, který nelze vložit do isset.
Od PHP 5.5 to možné bude. Otázkou je, zda to hackovat pro 5.4 a níže nebo z toho nechat čistě převod „? becomes isset“ bez další magie, což by podle mě bylo o něco transparentnější.
+ jsem na GitHubu před chvílí připsal komentář.
Editoval Majkl578 (15. 4. 2013 2:00)