Autor | Zpráva | ||
---|---|---|---|
Martin M. Profil * |
#1 · Zasláno: 8. 3. 2009, 17:29:54
Celý výkend se snažím vyřešit úkol z php, který je zadán takto:
$k = new kuchar(); $k->varit('mrkev')->moznosti(kuchar::VARIT)->moznosti(kuchar::DUSIT); $k->varit('brambor')->moznosti(kuchar::VARIT); $k->varit('maso')->moznosti(kuchar::SMAZIT)->moznosti(kuchar::VARIT)->moznosti(kuchar::DUSIT); $k->vypis(); a výsledek má (až) při zavolání metody vypis() vrátit text že mrkev se bude vařit a dust, brambor se bude varit... ovšem já mám strašný problém s tou konstrukcí ->moznosti()->moznosti()->moznosti() . Dělal jsem to asi takto: class kuchar{ const VARIT='vaří'; const DUSIT='dusí'; const SMAZIT='smaží'; private $nazvy; private $upravy; public function moznosti($vstup){ $this->upravy=$vstup; return Validator::varit(); } public function varit($nazev=null){ //z úsporných důvodů se položky pro prověření vloží do dalšího pole $this->nazvy=$nazev; return new kuchar; } public function vypis(){ return //vypsat výsledek } } Tady mám ale problém s tím že když hodnoty nacpu do dvou polí pak nevím jak ve vypis() rozlišit co patří k čemu. Ideální by to asi bylo dávat do jednoho dvourozměrného pole, kde by řetězec (parametr z varit) byl index 0 0 a obsah konstant potom 0 1, 0 2 ... a další řetězec potom 1 0 a řetězce z konstant potom 1 1 , 1 2 ... Ovšem nemůžu za boha v metode varit() dostat data z moznosti() a naopak v moznosti() data z varit() taky nedostanu... vůbec tomu nerozumím prosím pomoc. |
||
Majkl578 Profil |
#2 · Zasláno: 8. 3. 2009, 18:13:28 · Upravil/a: Majkl578
proc nepouzit jeden objekt se skladanim akci do pole a tim, ze funkce varit vrati $this ?
edit: prikladam upraveny kod: <?php class kuchar { private $actions = array(); private $active = null; const VARIT='vaří'; const DUSIT='dusí'; const SMAZIT='smaží'; public function moznosti($vstup) { $this->actions[$this->active][] = $vstup; return $this; } public function varit($nazev) { $this->active = $nazev; return $this; } public function vypis() { print_r($this->actions); } } $k = new kuchar(); $k->varit('mrkev')->moznosti(kuchar::VARIT)->moznosti(kuchar::DUSIT); $k->varit('brambor')->moznosti(kuchar::VARIT); $k->varit('maso')->moznosti(kuchar::SMAZIT)->moznosti(kuchar::VARIT)->moznosti(kuchar::DUSIT); $k->vypis(); ?> |
||
Timy Profil |
#3 · Zasláno: 8. 3. 2009, 18:23:31
Martin M.
Abys mohl použít konstrukci „->moznosti()->moznosti()->moznosti()“, musí metoda moznosti() vracet jako návratovou hodnotu $this, tj instanci aktuálního objektu. Druhé volání moznosti() („->moznosti()->moznosti()->moznosti()“) se totiž provede tak, že se pošle zpráva tomu, co vrátí první volání metody moznosti(). Ty teď vracíš nějaký nesmysl (Validator::varit()), pokud vrátíš $this, bude to fungovat. Zbytek se dá vyřešit třeba přes (asi vnořené) pole. |
||
Mastodont Profil |
#4 · Zasláno: 8. 3. 2009, 18:33:30
Mně tedy to zadání přijde značně ****, protože nastavovat možnosti extra metodou, která si musí pomáhat přes pomocnou proměnnou, aby bylo jasné, pro co se ty možnosti nastavují ...
|
||
Martin M. Profil * |
#5 · Zasláno: 9. 3. 2009, 14:43:50
Majkl578
Timy díky... tuto věc s tím return $this; jsem neznal a bez toho bych si s tím asi neporadil. |
||
Časová prodleva: 15 let
|
0