Autor | Zpráva | ||
---|---|---|---|
had Profil * |
#1 · Zasláno: 11. 9. 2013, 15:15:48
Ahoj,
mám tenhle kód: <?php $rok = 2013; $a = new AnalyzeLiturgicYear($rok); // provede analýzu roku, vytipuje určité mezníky, které se každý rok různě pohybují for($i = 1; $i < 13; $i++){ for($y = 1; $y < 32; $y++){ $b = new AnalyzeDay($rok, $i, $y); // analyzuje konkrétní den (např. který den v týdnu to je) } } ?> mám dvě třídy - AnalyzeLiturgicYear a její dítě AnalyzeDay. Rodič provádí analýzu roku a vypočítá určité datumy, se kterými se pak porovnávají a od nich se odvíjí vlastnosti jednotlivých dnů. Chtěl bych se zeptat, jestli je nějak možné předávat parametrem konstruktor rodiče ($a), abych nemusel po každém proběhnutí cyklu při volání konstruktoru dítěte znovu volat parent::__construct($rok); (a tak znovu a znovu provádět analýzu roku) a přesto bych mohl přistupovat k vlastnostem rodiče přes parent::getVlastnost(); ? Předem děkuju za pomoc. |
||
Alphard Profil |
#2 · Zasláno: 11. 9. 2013, 15:21:18
Můžete změnit AnalyzeLiturgicYear, aby vždy hned neanalyzoval rok (statická proměnná, analýza až v nějaké metodě). Ale spíš mám pochybnosti, jestli má být AnalyzeDay potomek.
|
||
had Profil * |
#3 · Zasláno: 11. 9. 2013, 15:34:03
Analýza roku je jediným úkolem třídy AnalyzeLiturgicYear - proč tedy vytvářet speciální metodu, která teprve bude spouštět analýzu? Samozřejmě řešením by to bylo. Fakt není možné obejít parent::__construct() a nějakým způsobem říct: parent = $a...?
Řekl bych, že AnalyzeDay by měl být potomkem AnalyzeLiturgicDay právě z toho důvodu, že ty proměnlivé mezníky jsou důležité pro analýzu dne. Pokud nebudu znát analýzu roku, nebudu schopný vrátit plnohodnotnou analýzu dne (např. to, mezi kterými mezníky roku se den nachází; který týden v daném období mezi těmi mezníky se ten konkrétní den nachází atd...). |
||
Alphard Profil |
#4 · Zasláno: 11. 9. 2013, 15:46:07
To, že je tam závislost, neznamená, že to musí být potomek. Instanci Roku můžete předat zcela nesouvisející třídě Den. Těžko říct, nevidím ty třídy.
Konstruktor vynechat nejde, ale zpracování v něm lze podmínit, to už jsem psal. |
||
had Profil * |
#5 · Zasláno: 11. 9. 2013, 15:49:24 · Upravil/a: had
Ok, přepíšu volání té analýzy roku do samostatné metody. Děkuju za pomoc a hezký den!
Hm... ani přepisem analýzy roku do nové metody si nepomůžu. Musel bych ukládat zjištěné informace do statických proměnných... v okamžiku, kdy zavolám parent::__construct() tak stejně nemám přístup k již zanalyzovanému objektu... zřejmě AnalyzeDay nebude moct být potomkem :-( |
||
tiso Profil |
had: nechceš vo vnútri AnalyzeDay niečo ako:
if ($rok != $this->lastAnalyzedYear) { //tak analyzuj rok a uloz si ziskane datumy } //teraz analyzuj konkretny den |
||
had Profil * |
#7 · Zasláno: 12. 9. 2013, 23:30:37
tiso: to bych samozřejmě mohl, ale jde spíš o to, jak pak přistupovat k vlastnostem toho objektu. Potřeboval bych nějak sdělit, že parent = $instance, abych pak mohl už jednoduše volat parent::$vlastnost. To ale není možné, protože to potřebuje předtím zavolat parent::__construct(), což provede novou analýzu (a toho se chci vyvarovat, to je zbytečné, když už jednou proběhla a pro všechny dny, které budeme analyzovat, tak je stále stejná).
zatím jsem to vyřešil tak, že jsem odstranil dědičnost mezi třídami a v parametru předávám instanci AnalyzeLiturgicYear. K vlastnostem AnalyzeLiturgicYear pak přistupuji přes proměnou: <?php class AnalyzeDay { private $analyzeLiturgicYear; public function __construct(AnalyzeLiturgicYear $analyzeLiturgicYear){ $this->analyzeLiturgicYear = $analyzeLiturgicYear; } public function debug(){ echo "vlastnost třídy AnalyzeLiturgicYear: ".$this->analyzeLiturgicYear->getVlastnost(); } } $b = new AnalyzeDay($a); $b->debug(); ?> je to trochu kostrbatý zápis, ale funguje to... |
||
tiso Profil |
#8 · Zasláno: 13. 9. 2013, 00:31:45
had: to ti radil už Alphard.
Keď tak na to pozerám, tak to celé vyzerá ako nevhodné použitie objektu (objektov). Vyzerá to na nejaký výpis cirkevného kalendára, alebo čo to presne chceš robiť? |
||
Časová prodleva: 3 dny
|
|||
had Profil * |
#9 · Zasláno: 15. 9. 2013, 23:44:01
tiso:
„to ti radil už Alphard.“ - ano, však jsme se dobrali řešení, ještě před tím, než jsi napsal svůj první příspěvek (- neber to, prosím, jako urážku) :-) „Vyzerá to na nejaký výpis cirkevného kalendára“ - áno, je to přesně ono :-) „nevhodné použitie objektu“ - v jakém smyslu ty myslíš? Špatný návrh? To je možné, s OOP se začínám kamarádit až posledního půl roku, do té doby jsem zůstaval u procedurálního programování. |
||
tiso Profil |
#10 · Zasláno: 16. 9. 2013, 00:31:48
had: aha, ono to vyzeralo ako keby si s tým riešením nebol spokojný.
Osobne by som to riešil nejak takto: class LiturgicCalendar { function __construct($year) {...} function print(){...} //dalsie funkcie } <?php $year = 2013; $calendar = new LiturgicCalendar($year); $calendar->print(); |
||
had Profil * |
#11 · Zasláno: 17. 9. 2013, 00:19:05
tiso: ano, tak nějak to řeším. Jedna třída (AnalyzeLiturgicYear) zjišťuje konfiguraci pro liturgický rok (jednotlivá data + posuvné slavnosti a svátky), druhá (AnalyzeDay) už řeší konkrétní věci (týden liturgické doby, týden žaltáře, ...), pak je třída, která zajišťuje data z databáze, další třída obstarává porovnávání dat z databáze (řešení priorit slavení), další zajišťuje uložení výsledku do databáze (cachování), další třída zajišťuje zase výpis z databáze...
„ono to vyzeralo ako keby si s tým riešením nebol spokojný.“ aha...nechtěl jsem být nespokojený :-) díky za ochotu řešit problém ;) |
||
Časová prodleva: 11 let
|
0