Autor Zpráva
had
Profil *
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
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 *
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
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 *
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 *
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
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ť?
had
Profil *
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
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
}
a kód v [#1] prepíšeš na:
<?php
$year = 2013;
$calendar = new LiturgicCalendar($year);
$calendar->print();
Pokiaľ používaš šablóny, MVC, tak to bude zložitejšie, LiturgicCalendar by ti mal vrátiť iba dáta pre zadaný rok a výpis by si robil inde.
had
Profil *
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 ;)

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: