Jak používat bezpečně „Nette properties“ i uvnitř třídy, která je definuje

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

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

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

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

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()