Autor Zpráva
rovi
Profil
Zdravím všechny,

mám celkem jednoduchý dotaz.
Jde o to, jestli v třídách používat instance tříd nebo třídu vytvořit jako potomka a pak volat rodičovské funkce? Taky by šlo vytvořit třídu se statickými funkcemi a ty následně využívat. Všechna řešení fungují, ale který způsob je 'správný' ? Prosím nevyvolávejte diskuze o tom, jak by se statika neměla využívat v OOP.
Jan Tvrdík
Profil
rovi:
Ptáš se na správný způsob, ale nesmím zmínit, že statika by se neměla používat? Nechápu. Co se těch ostatních možností týče, tak záleží na konkrétní situaci, ale většinou bude výrazně lepší se dědění vyhnout a preferovat skládání.
rovi
Profil
Pardon, děkuji za rychlou reakci a odpověď.

Většinou v každém tutoriálu ohledně objektového php je zmíněno, že v dobrém návrhu třídy by se člověk měl obejít bez statických funkcí. Stejně jako je 'lepší' používat gettery a settery než přímo přistupovat k proměnné třídy. Tj. echo $obj->foo; a echo $obj->getFoo();

Jasně, že statické funkce jsou někdy potřeba > proto tam taky jsou. Ale údajně by se je nemělo využívat jako primární cíl v návrhu třídy.
Alphard
Profil
I použití statických metod lze někdy dobře zdůvodnit. To pravidlo je spíš o tom, že by k nim člověk neměl utíkat ve chvíli, kdy neví, jak to udělat lépe.
Ten váš první dotaz jsem četl několikrát, ale je příliš obecný. Jestli chcete konkrétní odpověď, zkuste dát dohromady nějaký konkrétní příklad.
rovi
Profil
Ok, mám třídu database. Pak mám třídu user, která se - dle mého - úplně nehodí jako potomek třídy database, ale s třídou database pracuje. Jasně, že jí můžu napsat jako potomka, ale má to tak být?

Taky je možné, že mám od základu špatný návrh, ale jde mi spíš o tu obecnější rovinu.

Prostě chci ve své třídě využívat metod jiné třídy. Tak bych měl vytvořit instanci v třídě nebo dědit nebo využít statických funkcí.

Všechna řešení fungují. Jen nechci, aby to byl od pohledu bastl...
Alphard
Profil
Třída User určitě nemá být přímým potomkem driveru k databázi. Instance k database connection se má předávat. Často přímo v konstruktoru.

$dbConnection = new DbConnection($dbConfig);
$user = new User($dbConnection);

Prostě chci ve své třídě využívat metod jiné třídy.
To je právě příliš obecné.
- Jsou ty jiné třídy typu Services? Pokud ano, je třeba předávat jejich instance z venku jako závislosti.
- Jsou ty třídy využity pro jednoúčelovou práci? Pak se vytvoří instance v dané metodě.

Dejme tomu, že je aplikace na odesílání emailu, která pracuje se service třídou Mailer a obálkou Message pro samotný mail.
Mailer je společný pro celou aplikace (může tam být nastavení SMTP serveru apod.), takže ten budeme předávat jako závislost a třídu Message si vždy vytvoříme v místě potřeby.

public function sendConfirmMail(Mailer $mailer)
{
  $message = new Message;
  // ...
  $mailer->send($message);
}
rovi
Profil
Díky za odpověď. Já nepracuji s žádným frameworkem. Proto můj současný koncept návrhu tříd je ActiveRecord. Nicméně chci se odprostit od přetěžování tříd a přejít k MVC architektuře, ale až doplním potřebné dejme tomu základní znalosti.
A ano poslední část příspěvku - tak jsem to myslel.

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: