Autor Zpráva
NitroN2O
Profil
Mam triedu Trieda:

class Trieda
{
    private $premenna;
    private $kolekcia;
    
    function __construct() { $this->kolekcia = new Kolekcia; }
    
    function getPremenna() ...
    function getKolekcia() ...
    
    function __get($name)
    {
        switch ($name)
        {
            case "premenna": return $this->getPremenna();
            case "kolekcia": return $this->getKolekcia();
            default: throw new MemberAccessException($name);
        }
    }
}

ktora obsahuje kolekciu kolekcia:

class Kolekcia
{
    function add(Polozka $item) ...
    function remove(Polozka $item) ...
}

do ktorej sa pridavaju polozky v kazdej polozke by som chcel mat moznost pristupovat k premennej objektu tiredy "Trieda":

class Polozka
{
    function metoda()
    {
        echo ...->premenna;
    }
}

Viete mi poradit co najkratsi sposob ako to urobit? Zatial to riesim cez DI, cez konstruktor vkladam vzdy korenovu triedu. To je sice pekne, ale ked bude ta trieda zanorena dajme tomu 10 urovni, tak musim upravovat vsetky "medzi-clanky". Existuje nejaky "krajsi" sposob ako DI?
greeny
Profil
Tak použij proměnnou, ve které je ta Trieda uložená ;)
Joker
Profil
NitroN2O:
Takový problém je typicky příznak chyby v analýze.

Kdyby se tohle stalo mně, nejdřív bych zkoumal, proč vlastně třída na 10. úrovni zanoření potřebuje pracovat s rodičem rodiče rodiče rodiče…
Výsledek typicky je, v pořadí od (podle mého názoru) nejčastějšího:

1. Kořenová třída obsahuje informace/funkčnost, které ve skutečnosti nejsou jejími vlastnostmi, ale vlastnostmi té zanořené třídy, nebo nějakého mezičlánku.
→ Přesun vlastností z kořenové třídy níž

2. Zanořená třída dělá něco, co je ve skutečnosti funkčnost kořenové třídy, nebo nějakého mezičlánku.
→ Přesun funkčnosti ze zanořené třídy výš

3. Daná funkčnost vlastně nepatří nikam do objektového modelu, který mám.
→ Předělat objektový model

4. Zanořená třída při realizaci své funkčnosti opravdu potřebuje pracovat s tou kořenovou.
→ Nezbývá, než kořenovou třídu předávat přes všechny úrovně jako parametr.

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: