Jak používat bezpečně „Nette properties“ i uvnitř třídy, která je definuje
- Ascaria
- Člen | 187
Vím, že jsem pravděpodobně objevil kolo, ale nevidím to v této sekci, tak přidávám.
/**
* @property-read String $bhoj
*/
class Pozdravy extends Control
{
private $ahoj = null;
private $_bhoj = null;
public function getAhoj()
{
if(null === $this->ahoj)
{
$this->ahoj = 'ahoj';
}
return $this->ahoj;
}
public function getBhoj()
{
if(null === $this->_bhoj)
{
$this->_bhoj = 'bhoj';
}
return $this->_bhoj;
}
public function render()
{
$this->template->ahoj = $this->ahoj; // přistoupí se přímo k ahoj, IDE napoví, co ahoj je
$this->template->bhoj = $this->bhoj; // použije se property getBhoj(), IDE napoví, co bhoj je, díky @property-read nad třídou (testováno jen v netbeans)
}
}
Editoval Ascaria (13. 4. 2012 12:17)
- Filip Procházka
- Moderator | 4668
V rámci třídy bys neměl properties používat. Jenom z venu, protože pak v tom máš zjevný bordel.
/**
* @property-read string $ahoj
*/
class A extends \Nette\Object
{
private $ahoj;
public function __construct()
{
$this->ahoj = 'ahoj';
}
public function getAhoj()
{
return $this->ahoj;
}
public function render()
{
$this->template->a = $this->getAhoj(); // ahoj
}
}
Navíc, celý ten tvůj příspěvek je neuvěřitelně zmatený. Moc nechápu, o co se snažíš.
- Ascaria
- Člen | 187
Co je špatného na používání properties uvnitř třídy? Vždyť se běžně používají properties v potomkovi třídy, viz. tvoje „$this->template“ taky nevrátí template přímo, protože je private v parentovi, takže se použije getTemplate().
Máš pravdu, že ten můj příspěvek je zmatený, upravil jsem ho. Snažím se o to, aby šly property používat jako property uvnitř třídy, bez psaní $this->getBhoj() ale jen $this->bhoj. Pokud budu chtít přistoupit přímo k bhoj, použiju $this->_bhoj.
Editoval Ascaria (13. 4. 2012 12:23)
- Jan Tvrdík
- Nette guru | 2595
Pokud se nemýlím, tak Nette od svého počátku nabízí řešení ve formě používání properties s velkým písmenem (jako je zvykem třeba v C#).
<?php
class Foo extends Nette\Object
{
private $bar;
public function getBar()
{
return $this->bar;
}
private function internal()
{
$a = $this->bar; // přímý přístup k $this->bar
$b = $this->Bar; // přístup přes $this->getBar()
}
}
$x = new Foo();
$y = $x->Bar; // přístup přes getBar()