Autor Zpráva
Martin M.
Profil *
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
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
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
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 *
Majkl578
Timy
díky... tuto věc s tím
return $this;
jsem neznal a bez toho bych si s tím asi neporadil.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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