Autor Zpráva
spartan13
Profil
Dobrý den, mám následující kód ale nechápu proč nefunguje getter $this->model->vek(obdobný příklad zde: http://doc09.nette.org/cs/quickstart/hezci-sablony )

můj kód:
<?php
  
Class Pes
{
  public function stek()
  {
    return "haf";
  }
  public function vek()
  {
    return rand(10,90);
  }
}

Class Trida
{
  private $pes=NULL;
  
  public function vypis()
  {
    return $this->model->vek();
  }  
  
  public function getModel()
  {
    if (!isset($this->pes)) $this->pes=new Pes;
    
    return $this->pes;
  }
  
}

$c=new Trida;
echo $c->vypis();


?>
Moderátor Joker: Značka [pre] má být kolem kódu, ne za ním.
spartan13
Profil
spartan13:
a chyby jsou:


Notice: Undefined property: Trida::$model in C:\wamp\www\pokus.php on line 21

Fatal error: Call to a member function vek() on a non-object in C:\wamp\www\pokus.php on line 21
Kry5
Profil
Nejdřív musíš zavolat
$c->getModel();
tedy před voláním
$c->vypis();
.
Protože jinak je proměnná $pes nulová.

Další chyba bude asi v metodě vypis:
public function vypis() 
{ 
return $this->pes->vek(); 
} 
juriad
Profil
Domněnka:
Pokud funguje php stejně jako jiné jazyky, tak je getter úplně obyčejná metoda (jen se tak z konvence jmenuje, protože začíná slovem get), a proto ji také tak musíš volat.
$this->getModel()->vek()
Kry5
Profil
spartan13:
Druhou možností, je udělat constructor, kterej automaticky vyplní ten model a pak getModel volat nemusíš:
public function __construct()
{
     $this->pes=new Pes;
}
spartan13
Profil
ano, máte pravdu je nutné volat getModel() a jedná se tedy o normální metodu, která se tak jmenuje jen z důvodů zvyklostí.. jen poněkud nechápu v dokumentaci nette, jak to tam může fungovat.
Kry5
Profil
S nette ti můžu poradit. Co konkrétně ti není jasné? Nette využívá systém action a render metod ke kterým patří většinou i HTML šablona. Při přechodu na adresu šablony pak nette tyto dvě metody volá automaticky. Ale asi ti není jasné spíš něco jiného :-)

Jinak metodu getModel musíš volat proto, že jinak proměnná $pes pořád obsahuje výchozí hodnotu NULL a musíš ji nastavit na new Pes();
což můžeš buďto udělat v konstruktoru jak jsem psal výše (ten se volá automaticky hned po vytvoření objektu dané třídy) nebo "ručně" přes getModel();
spartan13
Profil
Kry5:
šlo mi u tutoriálu (http://doc09.nette.org/cs/quickstart/hezci-sablony)
o třídu TodolistPresenter,
kde je funkce getModel() která jestli jsem správně pochopil měla dělat to samé, co jsem zde chtěl vlastně já..

asi jsem tam špatně pochopil, že se pravděpodobně funkce z třídy TodoManger přidají do $this->model
Kry5
Profil
spartan13:
Nějak jsem to nestudoval, ale dělá to to samé.

No nepřidají se, ale vytvoří se objekt, což je nějaká instance třídy, která umožňuje používat její metody a pracovat s ní aniž by to ovlivňovali nějaký její jiný objekt. Ale abys s ní mohl pracovat tak jí nejdřív musíš říct, že se má stát právě tímto objektem pomocí new Pes();

Když to neudělá tak je logické, že to nebude fungovat. To je jako kdyby ses divil, že ti tento kód nic nevypíše:

$prom = "";

echo $prom;
Tori
Profil
spartan13:
kde je funkce getModel() která jestli jsem správně pochopil měla dělat to samé, co jsem zde chtěl vlastně já..
Aby vám to takto fungovalo, tak buď musíte volat getter
$this->getModel()->vek();
, anebo - aby PHP pochopilo $this->model jako volání $this->getModel() - definovat třídu Trida jako potomka třídy Nette\Object. Viz API (Nette\Object, Nette\ObjectMixin), docs

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0