bug pri poliach v template

- RichardT
- Člen | 43
Zdarvím, narazil som v Nette na malý bug, používam verziu 5.2 bez prefixov a PHP 5.2.6.
Modifikoval som si HomepagePresenter v skeletone
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->title[] = 'It';
$this->template->title[] = "doesn't";
$this->template->title[] = 'works!';
}
}
samozrejme adekvátne aj šablónu, a privítala ma hláška
Warning: The variable 'title' does not exist in template '' in H:\web\www\nette\examples\templateerr\libs\Nette\Templates\Template.php on line 413.
Pole je samozrejme prístupné a dá sa s ním plnohodnotne pracovať. Pokiať
predávam pole pomocou funkcie array, warning sa nevyhadzuje.
Editoval RichardT (20. 7. 2009 22:52)

- Jan Tvrdík
- Nette guru | 2595
To není problém imho Nette, ale toho, že pracuješ s nedefinovanou proměnnou. Většina jiných jazyků by ti takový přístup vůbec nedovolila.
public function renderDefault()
{
$this->template->title = array();
$this->template->title[] = 'It';
$this->template->title[] = "doesn't";
$this->template->title[] = 'works!';
}
Poznámka: Ono se totiž to
$this->template->title[] = 'It'; přeloží jako
$temp = $this->template->__get('title'); // Tady to spadne na nedefinované proměnné
$temp[] = 'It';
Editoval Jan Tvrdík (20. 7. 2009 23:35)

- RichardT
- Člen | 43
Je mi jasné že u väčšiny jazykov by to neprešlo, ale v PHP môžeš
pracovať s nedefinovanými premennými – to sa nepovažuje za chybu. A tá
premenná je definovaná – veď to je pole, len je vytvorené iným
spôsobom. A ja som mal za to, že oba spôsoby, jak pomocou funkcie array tak
pomocou indexov sú rovnocenné. Ale je to nepodstatné, dá sa to „obísť“
tak ako si napísal $this->template->title = array(); a potom
vytvárať indexami, ale v „čistom PHP“ ti prejde aj to, keď začneš pole
vytvárať rovno s indexami a funkciu array() nemusíš vôbec
použiť.

- Ondřej Mirtes
- Člen | 1536
RichardT napsal(a):
Je mi jasné že u väčšiny jazykov by to neprešlo, ale v PHP môžeš pracovať s nedefinovanými premennými – to sa nepovažuje za chybu. A tá premenná je definovaná – veď to je pole, len je vytvorené iným spôsobom. A ja som mal za to, že oba spôsoby, jak pomocou funkcie array tak pomocou indexov sú rovnocenné. Ale je to nepodstatné, dá sa to „obísť“ tak ako si napísal
$this->template->title = array();a potom vytvárať indexami, ale v „čistom PHP“ ti prejde aj to, keď začneš pole vytvárať rovno s indexami a funkciuarray()nemusíš vôbec použiť.
Myslím, že členskou proměnnou (tzv. property) bys definovat měl vždy. S jejím nedefinováním byl spojen nějaký bug, nejspíš ve verzi 5.2.0.