Autor Zpráva
marrra
Profil
Zdravím,

setkal jsem se se zajímavým/podivným způsobem, jak ušetřit pár řádků kódu při práci s objekty.

Příklad - zjištění údajů o uživateli:

$users = new Users();
$user = $users->getUserById($id);

je nahrazen:

$user = Users()->getUserById($id);

přičemž je definovaná funkce:

function Users() {
return new Users();
}

Mohl bych poprosit o Váš názor na tento přístup - výhody/nevýhody ?
Dle autorů tohoto přistupu spočívá výhoda v tom, že se stále dokola nemusí psát $users = new Users();

Díky.
Sir Tom
Profil
marrra:
Také zdravím. No je pravda, že stále nemusíš psát $users = new Users(), ale kde pak máš uloženou instanci třídy Users? Co když pak budu chtít použít již na hotovou instanci tř. Users nějakou jinou metodu (např. setMetodu). To opět použiješ řešení přes fci Users() a vytvoříš novou instanci? Podle názvu třídy Users se domnívám, že se jedná o třídu, která spravuje nějaký seznam uživatelů. Proč mít tedy více těchto seznamů? Stačí jenom jeden, ne? To také vede k tomu, že by funkce Users() měla při vytvoření už jedné instance vracet právě tuto instanci (jak píšeš v titulku) a nikoliv nový seznam Users (jak zobrazuje příklad). (Návrhový vzor Singleton.)
marrra
Profil
Díky za odpověď.

V našem případě metoda getUserById() volá SQL dotaz a vrátí výsledek. Žádný stav v objektu uchovávat nepotřebujeme.
Takže se při každém volání fce vytvářní nová instance.
Tori
Profil
marrra:
V našem případě metoda getUserById() volá SQL dotaz a vrátí výsledek.
V tom případě může rovnou být statická - Users::getUserById($id)
Kromě toho můžete používat i Users::getInstance()->getUserById($id). Jestli si bude metoda getInstance vytvořené objekty někam ukládat (vzor Singleton anebo Factory) nebo vytvářet pokaždé novou instanci, to už zůstane záležitostí vnitřní implementace a případná změna neovlivní rozhraní.

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: