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.