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 |
#2 · Zasláno: 15. 11. 2011, 19:17:04
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 |
#3 · Zasláno: 15. 11. 2011, 19:23:08
Nejdřív musíš zavolat
$c->getModel(); $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 |
#4 · Zasláno: 15. 11. 2011, 19:43:10
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 |
#5 · Zasláno: 15. 11. 2011, 19:52:14
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 |
#6 · Zasláno: 15. 11. 2011, 20:25:58
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 |
#7 · Zasláno: 15. 11. 2011, 20:34:10
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 |
#8 · Zasláno: 15. 11. 2011, 20:45:30 · Upravil/a: spartan13
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 |
#9 · Zasláno: 15. 11. 2011, 20:51:48
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 |
#10 · Zasláno: 16. 11. 2011, 02:09:10
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(); |
||
Časová prodleva: 12 let
|
0