bug pri poliach v template

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

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
+
0
-

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
+
0
-

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
+
0
-

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 funkciu array() 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.